📌析构函数是类的另一个特殊成员函数,它的作用与构造函数相反,C++规定析构函数的名字是类的前面加上一个波浪号(~)
析构函数不返回任何值,没有返回类型,也没有函数参数。
由于没有函数参数,因此它不能被重载。换言之,一个类可以有多个构造函数,但是只能有一个析构函数。
~classname() { /*code */ }
- 1
- 2
- 3
- 4
- 5
类析构顺序:1)派生类本身的析构函数;2)对象成员析构函数;3)基类析构函数。
在所有函数之外创建的对象是全局对象,它和全局变量类似,位于内存分区中的全局数据区,程序在结束执行时会调用这些对象的析构函数。
在函数内部创建的对象是局部对象,它和局部变量类似,位于栈区,函数执行结束时会调用这些对象的析构函数。
new 创建的对象位于堆区,通过 delete 删除时才会调用析构函数;如果没有 delete,析构函数就不会被执行。
编译器总是会为类生成一个析构函数,称为合成析构函数。
合成析构函数按照对象创建时的逆序来撤销每个非静态成员,即它是按照成员在类中声明的次序来撤销成员的。
对于类类型的每个成员,合成析构函数调用该成员的析构函数来撤销对象。
需要注意,合成析构函数并不删除指针成员所指向的对象,他需要程序员显示地编写析构函数去处理。
将可能会被继承的父类的析构函数设置为虚函数,可以保证当我们new一个子类,然后使用基类指针指向该子类对象,释放基类指针时可以释放掉子类的空间,防止内存泄漏。
默认的析构函数非虚函数
C++默认的析构函数不是虚函数是因为虚函数需要额外的虚函数表和虚表指针,占用额外的内存。而对于不会被继承的类来说,其析构函数如果是虚函数,就会浪费内存。因此C++默认的析构函数不是虚函数,而是只有当需要当作父类时,设置为虚函数。