一,析构函数
析构函数没有形参,
~类名()
{
// 方法体
}
组成
负责对类资源的回收,
①delete动态内存资源,防止内存泄漏,
②更新类的一些信息,比如对象总数量自减1
③也没有返回值
④不能被重载,析构函数是唯一的
①旧知复习
(Ⅰ)初始化列表初始化顺序
初始化列表用于构造函数,那么初始化列表的顺序就会按照类定义中声明的顺序去初始化
而非初始化列表的顺序
(Ⅱ)多重继承时调用构造器的顺序
继承符号 : 后面依次继承多个类
按照从左到右的继承顺序去调用基类的构造函数
class Base1{}
class Base2{}
class Base3{}
class Derived : public Base3 , public Base1 , public Base2{}
那么就会依次调用Base3(),Base1(),Base2()构造函数
②回到析构函数的销毁顺序
先执行函数体,再依次销毁成员,成员按照初始化顺序的逆序销毁
千万注意!!!:
(Ⅰ)隐式销毁一个内置指针成员并不会delete它所指向的对象
(Ⅱ)当指向一个对象的引用或指针离开其作用域时,其析构函数不会被执行
也就是说,你动态申请的内存,必须要手动释放,即使析构函数销毁了该指针,也不会释放该动态内存!!!
与智能指针有区别的是:
智能指针能自动释放它所管理的内存,是因为它是类对象,而非普通的内置指针,类对象超出了
它的作用域范围之后,就会自动析构,而智能指针的析构函数内存管理可以自动delete该成员
管理的内存,因此不需要担心
二,何时调用析构函数
无论一个对象合适被销毁,就会自动调用其析构函数
①变量在其离开作用域后被销毁
②当一个对象被销毁时,其成员被销毁
③容器(无论是标准库容器还是数组,)被销毁时,其元素被销毁
④对于动态分配的对象,当指向它的指针被用于delete时,被销毁
⑤对于临时对象,当创建它的完整表达式结束时被销毁
三,合成析构函数
当类中未定义析构函数时,编译器自动合成一个无任何代码的析构函数