1. 特征
- 类的一个成员函数
- 名字由波浪号接类名构成
- 没有返回值
- 不接受参数
- 不能被重载,对于一个给定的类,只会有一个析构函数
class Foo{
public:
~Foo();
}
2. 析构函数的几个重要特征
- 析构函数体自身并不直接销毁成员
- 成员是在编译器在析构函数体之后隐含的析构阶段被销毁的
- 析构函数首先执行函数体,然后按照成员初始化的逆序顺序来销毁成员。
3. 析构函数的调用时机
- 无论何时一个对象被销毁,就会自动调用其析构函数
- 变量离开其作用域时被销毁。
- 当一个对象被销毁,其成员也将被销毁。
- 容器(无论是标准容器还是数组)被销毁时,其元素也将被销毁。
- 对于动态分配的对象,当对指向它的指针引用 delete 时运算符时被销毁。
- 对于临时对象,当创建它的完整表达式结束时被销毁。
//新的局部作用域
{
Sales_data *p = new Sales_data();
auto p2 = make_shared<Sales_data>();
Sales_data item(*p);
vector<Sales_data> vec;
vec.push_back(*p2);
delete p; //对p指向的对象执行析构函数
} //退出局部作用域,对p2,item,vec,调用析构函数
//销毁p2会递减其引用计数,如果引用计数变为0,对象被释放
//销毁vec,也会将其内部的元素销毁
4. 合成析构函数synthesized destructor
当一个类未定义自己的析构函数,编译器会为它定义一个合成析构函数。合成析构函数的函数体是空的。