Appearance
析构函数
功能:对象消亡时,释放内存空间和其他善后工作
格式
- 无返回值
- 无参数
- 默认
public
cpp
~Stu() { 函数体内容 }调用时机
- 栈区:对象生命周期结束,自动调用
- 堆区:使用
delete手动释放
默认析构函数
- 没有显性定义析构函数的时候,默认提供一个析构函数
- 如果显式定义了析构函数,系统不再提供默认析构函数
- 没有指针成员对象的时候,默认的即可;当有指针对象的时候,需要显式定义,并在函数体内释放对应内存空间
- 有继承关系时,需要显式定义析构函数,并定义成虚析构函数,否则基类的内存空间没法被释放
- 默认调用的析构函数,按照栈区 FILO 的原则,后构造的先析构:即先调用派生类的析构函数,再调用基类的析构函数,示例
cpp
#include <iostream>
using namespace std;
class Base {
public:
Base() { cout << "基类构造函数被调用" << endl; }
~Base() { cout << "基类析构函数被调用" << endl; }
};
class Member {
public:
Member() { cout << "成员对象构造函数被调用" << endl; }
~Member() { cout << "成员对象析构函数被调用" << endl; }
};
class Derived: public Base {
Member member;
public:
Derived(): member(Member()) { cout << "派生类构造函数被调用" << endl; }
~Derived() { cout << "派生类析构函数被调用" << endl; }
};
int main() {
// 栈区
// Derived d;
// 堆区
Derived* d2 = new Derived();
delete d2;
}txt
基类构造函数被调用
成员对象构造函数被调用
派生类构造函数被调用
派生类析构函数被调用
成员对象析构函数被调用
基类析构函数被调用