C++语言程序设计

10.2.3 析构函数
我们已经知道，当对象创建时，会自动调用构造函数进行初始化。当对象销毁时，也会自动调用析构函数进行一些清理工作。与构造函数类似的是：析构函数也与类同名，但在名字前有一个~符号，析构函数也没有返回类型和返回值。但析构函数不带参数，不能重载，所以析构函数只有一个。
若一个对象中有指针数据成员，该指针数据成员指向某一个内存块。在对象销毁前，往往通过析构函数释放该指针指向的内存块。例如，Set类中elems指针指向一个动态数组，我们应该给Set类再定义一个析构函数，使elems指向的内存块能够在析构函数中被释放：
class Set
{
public:
Set (const int size);
~Set(void) {delete elems;} // 析构函数
//...
private:
int *elems; // 集合元素
int maxCard; // 集合最大尺寸
int card; // 集合元素个数
};
下面我们通过一个例子，分析析构函数是如何工作的：
void Foo (void)
{
Set s(10);
//...
}
当函数Foo被调用时，创建对象s，并调用其构造函数，为s.elems分配内存及初始化其它对象成员。在Foo函数返回以前，s的析构函数被调用，释放s.elems指向的内存区。
注意：对象的析构函数在对象销毁前被调用，对象何时销毁也与其作用域有关。例如，全局对象是在程序运行结束时销毁，自动对象是在离开其作用域时销毁，而动态对象则是在使用delete运算符时销毁。析构函数的调用顺序与构造函数的调用顺序相反。