第13章 复制控制(4)
13.3 析构函数
析构函数可以完成资源回收,作为类构造函数的补充。
1. 何时调用析构函数
撤销类对象时会自动调用析构函数。
变量在超出作用域时应该自动撤销。
动态分配的对象只有在指向该对象的指针被删除时才撤销。如果没有删除指向动态对象的指针,则不会运行该对象的析构函数,对象就一直存在,从而导致内存泄漏,而且对象内部使用的任何资源也不会释放。
当对象的引用或指针超出作用域时,不会运行析构函数。只有删除指向动态分配对象的指针或实际对象(而不是对象的引用)超出作用域时,才会运行析构函数。
撤销一个容器(不管是标准库容器还是内置数组)时,也会运行容器中的类类型元素的析构函数。
容器中的元素总是按逆序撤销。
2. 何时编写析构函数
析构函数通常用于释放在构造函数或在对象生命期内获取的资源。
如果类需要析构函数,则它也需要赋值操作符和复制构造函数,这是一个有用的经验法则。这个规则成为三法则,指的是如果需要析构函数,则需要所有这三个复制控制成员。
3. 合成析构函数
与复制构造函数或赋值操作符不同,编译器总是会为我们合成一个析构函数。合成析构函数按对象创建时的逆序撤销每个非static成员,因此,它按成员在类中声明次序的逆序撤销成员。对于类类型的每个成员,合成析构函数调用该成员的析构函数来撤销对象。
撤销内置类型成员或复合类型的成员没什么影响。尤其是,合成析构函数并不删除指针成员所指向的对象。
4. 如何编写析构函数
析构函数是个成员函数,它的名字是在类名字之前加上一个代号(~),它没有返回值,没有形参。因为不能指定任何形参,所以不能重载析构函数。虽然可以为一个类定义多个构造函数,但只能提供一个析构函数,应用于类的所有对象。
析构函数与复制构造函数或赋值操作符之间的一个重要区别是,即使我们编写了自己的析构函数,合成析构函数仍然运行。
class Class5
{
public:
~Class5()
{
}
};
摘自 xufei96的专栏
补充:软件开发 , C++ ,