“析构函数”是构造函数的反向函数。 在销毁(释放)对象时将调用它们。 通过在类名前面放置一个波形符 (~
) 将函数指定为类的析构函数。
该语法的第一种形式用于在类声明中声明或定义的析构函数;第二种形式用于在类声明的外部定义的析构函数。
多个规则管理析构函数的声明。 析构函数:
-
不接受参数。
-
无法指定任何返回类型(包括
void
)。 -
无法使用
return
语句返回值。 -
无法声明为 const、
volatile
或 static。 但是,可以为声明为 const、volatile
或 static 的对象的析构调用它们。 -
可以声明为 virtual。 通过使用虚拟析构函数,无需知道对象的类型即可销毁对象 - 使用虚函数机制调用该对象的正确析构函数。 请注意,析构函数也可以声明为抽象类的纯虚函数。
当下列事件之一发生时,将调用析构函数:
-
使用 delete 运算符显式解除分配了使用 new 运算符分配的对象。 使用 delete 运算符解除分配对象时,将为“大多数派生对象”或为属于完整对象,但不是表示基类的子对象的对象释放内存。 此“大多数派生对象”解除分配一定仅对虚拟析构函数有效。 在类型信息与实际对象的基础类型不匹配的多重继承情况下,取消分配可能失败。
-
具有块范围的本地(自动)对象超出范围。
-
临时对象的生存期结束。
-
程序结束,并且存在全局或静态对象。
-
使用析构函数的完全限定名显式调用了析构函数。 (有关详细信息,请参阅显式析构函数调用。)
示例
// operator delete[] example #include <iostream> // std::cout struct MyClass { MyClass() {std::cout <<"MyClass constructed ";} ~MyClass() {std::cout <<"MyClass destroyed ";} }; int main () { MyClass * pt; pt = new MyClass[3]; delete[] pt; return 0; }
输出:
myclass constructed
myclass constructed
myclass constructed
myclass destroyed
myclass destroyed
myclass destroyed