类和对象
类和对象
面向对象的三大特性:封装、继承、多态。
封装
- 将属性和行为做一个整体
- 权限控制
class Circle
{
public:
Circle(){
cout<<"构造函数"<<endl;
}
int r;
double l()
{
return 2*PI*r
}
};
int main(){
Circle c;
c.r = 10;
cout<<c.l()<<endl;
}
访问权限一共有三种:
- 公共权限:类内、类外也可以访问
- 保护权限:类内可以访问,类外不能访问,可集成
- 私有权限:类内可以访问,类外不能访问,不可继承
class 与 struct 本质上是一个东西,都可以做容器,其本质区别在于:
struct 默认访问权限为public,class 默认为私有。
成员属性设置为私有的使用场景:
- 控制读写权限
- 再修改前,可以进行检查:比如A.change(...)来修改某个私有成员,在该函数中进行检查。
对象化的初始化和清理
- 初始化一个对象的状态(初始化);
- 使用完一个对象,也要及时清理(析构)。
初始化函数与析构函数会被编译器是自动调用。
构造函数类名(){}
- 构造函数没有返回值
- 与类同名
- 构造函数可以有参数,因此可以发生重载
析构函数~类名(){}
构造函数
- 无参构造
- 有参构造
- 拷贝构造
类名 (){};
类名 (参数){};
类名 (const 类名 &p){};
如何实例化对象时候指定各种构造函数呢?
Person p1;
Person p2(1,2);
person p3(p2);
Person p1;
Person p2 = Person(10);
Person p3 = Person(p2);
继承
继承是面向对象的三大特性之一,通过继承减少重复代码。
class Web
{
public:
function1(){};
function2(){};
};
class ChildWeb : public Web
{
public:
child_function(){};
}
继承方式:
- 公共继承
- 保护继承
- 私有继承
可以看出,公共继承就是直接照搬;保护继承就是把父类中的公共放在保护中;最后私有就是全部放到私有成员中。
不可访问不代表不放入内存中!
继承中的构造和析构顺序:父构造,子构造,子析构,父析构。
继承中同名成员:调用子类的成员child.func()
, 调用父类的成员child.base::func()
多态
静态多态:函数重载,运算符重载。编译阶段确定函数地址;
动态多态:派生类和虚函数实现运行时多态。运行阶段确定函数地址。
动态多态的条件:
- 继承
- 子类重写父类的虚函数
virtual void function