构造函数初始化对象的非static数据成员,而析构函数释放对象使用的资源,并销毁对象的非static数据成员。
构造函数有一个初始化部分和一个函数体,析构函数有一个函数体和一个析构部分。在一个构造函数中,成员的初始化是在函数体执行之前完成的,且按照它们在类中出现的顺序进行初始化。在一个析构函数中,首先执行函数体,然后销毁成员。成员按初始化顺序的逆序销毁。
析构部分是隐式的。成员销毁时发生什么完全依赖于成员的类型。销毁类类型的成员需要执行自己的析构函数。内置类型没有析构函数,因此销毁内置类型成员什么也不需要做。
隐式销毁一个内置指针类型的成员不会delete它所指向的对象。
无论何时一个对象被销毁,就会自动调用其析构函数:
1.变量在离开其作用域时被销毁;
2.当一个对象被销毁时,其成员被销毁;
3.容器(无论是标准库容器还是数组)被销毁时,其元素被销毁;
4.对于动态分配的对象,当对指向的它的指针应用delete运算符时被销毁;
5.对于临时对象,当创建它的完整表达式结束时被销毁。
当指向一个对象的引用或指针离开作用域时,析构函数不会执行。
合成析构函数
当一个类未定义自己的析构函数时,编译器会为它定义一个合成析构函数。类似拷贝构造函数和拷贝赋值运算符,对于某些类,合成析构函数被用来阻止该类型的对象被销毁。如果不是这种情况,合成析构函数的函数体就为空。
析构函数体自身并不直接销毁成员。