1、析构函数形式: ~类名() { } 无参数,无返回值,故不能被重载,只能有一个 2、作用:释放类对象占用的资源(不能释放动态分配的资源 如用 new 申请的资源) 当一个变量超出自己的作用域时占用的资源会被释放,同样,动态分配的资源在此时是不被释放的 必须手动的释放,否则会造成内存泄露 如: string *p ; { string *q = new string("hello") p = q ; }//在这里当遇到右花括号,会释放他所在块申请的资源,但动态分配的无法释放 cout<<*p<<endl ; 输出结果为:hello 同样析构函数也无法释放对象中动态申请的资源 如 1 class node 2 { 3 public: 4 5 int a,b; 6 node() 7 { 8 *p = "hello" ; 9 a = 0 ; 10 b = 0 ; 11 } 12 ~node() 13 { 14 cout<<"this is destruct " ; 15 //delete p ; 16 } 17 18 }; 19 20 int main() 21 { 22 string *q ; 23 24 { 25 node a ; 26 q = a.p ; 27 } 28 29 cout<<"q is "<<*q<<endl ; 30 31 } 输出结果:hello 但是如果加上delete,就会出错了。 3、合成析构函数: 无论我们自己是否为类编写析构函数,编译器都会合成一个析构函数,用于释放 资源,而我们的自己的析构函数只是在释放对象是做些想做的操作(书上这么说的 虽然我感觉不是这样,当然可以理解为只有我们自己的析构函数执行操作并释放资源 ),所以释放对象的时候先执行我们自己的析构函数,再执行合成的析构函数。 4.析构函数撤销对象的顺序: 无论是类对象之间,还是类对象内部的数据成员,析构函数都是按照声明顺序的逆序 释放资源 */