3.5.11 析构函数
创建类的对象时,会自动调用某个合适的构造函数。同样,当对象被摧毁时,也会自动调用一个析构函数(Destructor)。
例如,对象的摧毁出现在如下两种情况:
以某个类作为数据类型的变量超出其作用范围。
用delete操作符删除动态分配的对象。
与构造函数一样,析构函数也是一个成员函数。对于类C,其析构函数的原型如下所示(符号~与类名C之间可以有空格):
由于析构函数不带参数,因此不能被重载,这样,每个类只能拥有一个析构函数。与构造函数一样,析构函数也没有返回类型,所以下面的析构函数声明是错误的:
例3-34
程序清单3-8的输出如下:
main函数的工作流程如下:
1. 通过如下语句创建一个局部对象c0:
对象c0的创建将伴随着转型构造函数的调用,c0此时生效,直到main函数退出之前的那一刻(见7)。
2. 创建对象c1,对象c1的创建将伴随着默认构造函数的调用。
3. 创建对象c2,对象c2的创建将伴随着转型构造函数的调用。
4. 由于定义c1和c2的语句位于一个程序块当中,因此在程序块结束之前的一刻,分别调用了c1和c2的析构函数。
5. 使用new操作符动态地分配一个对象,并将其地址保存在类型为C*的指针ptr中,由于使用了操作符new,调用默认构造函数以初始化ptr所指对象。
6. 使用delete操作符删除ptr所指对象,此时自动调用析构函数。
7. main函数在退出之前调用c0的析构函数(上面的输出信息可以证明这一点)。
程序清单3-8 构造函数与析构函数的调用
我们已经知道,在创建对象时,类的构造函数负责完成初始化和其他相关的操作,而析构函数在对象摧毁时完成相应的清理工作(例如将构造函数分配的资源释放掉)。我们建议为每个带有数据成员的类设计一个默认构造函数,如果需要,也要设计其他构造函数及析构函数。