构造函数个析构函数:
拷贝构造函数:
参数是放入一个对象。加入const ,表明在拷贝的时候不能修改原有对象的值。
拷贝构造函数不能匿名调用
使用场景:
- 用已经创建的对象初始化新的对象
- 以值传递的方式给函数参数传值
构造函数的调用:
隐式类型转换调用:
总结:
深拷贝和浅拷贝:
浅拷贝系统提供。
多次释放同一处内存会出现内存奔溃。
深拷贝:需要自己写拷贝构造函数
总结:
explicit关键字:防止隐式类型转
动态对象的创建new关键字
Person* p = new Person;
静态成员变量:
- 在编译阶段就分配空间,对象还没创建,就已经分配空间。一个类所有对象共享。
- 通过类名访问
- 通过对象访问
静态成员函数:
- 不能调用普通的成员变量
- 可以访问静态成员变量
单例模式
一个类中只有对象
单例模式:
class ChairMan
{
//构造函数私有化,拷贝构造函数私有化
private:
ChairMan()
{
cout << "创建国家主席" << endl;
}
ChairMan(const ChairMan& c) {}
public:
//get方法
static ChairMan * getInstance()
{
return singleMan;
}
private:
static ChairMan * singleMan;
};
ChairMan * ChairMan::singleMan = new ChairMan;
this指针:this指针指向被调用的成员函数所属的对象
- 静态成员函数没有默认的this指针
- 解决命名冲突
常函数与常对象:
符号重载:
+
类继承方式:
继承中构造函数和析构函数的调用:
查看类的结构:
子类与父类成员变量与成员函数同名时:
就近原则,调用父类的则加作用域
多继承:多继承容易出现二义性,出现二义性用作用域解决
菱形继承的解决方案:
采用虚继承 操作的是一份共享数据
多态原理:
抽象类
//纯虚函数
//有纯虚函数的类又叫抽象类,无法实例化对象
//抽象类无法实例化对象
virtual int getResult() = 0;
虚析构与纯虚析构:
虚析构解决的问题:
- 当父类中有虚函数,则普通的析构函数不会调用子类的析构函数,需要把父类的析构函数改成虚析构
- -通过父类指针指向子类对象释放时候不干净导致的问题。
纯虚析构:
向上转型和向下转型: