- 作为成员函数的一种,用于在对象消亡时做一些释放空间的善后工作。
- 与构造函数对应,但是一个类只有一个。
- 名字与类名相同,在前面加“~”。
- 缺省的析构函数不涉及释放用户申请的内存释放等清理工作
对象数组的每个元素的析构函数都会被调用
class Ctest {
public:
~Ctest() { cout<< "destructor called" << endl; }
};
int main () {
Ctest array[2];
cout << "End Main" << endl;
return 0;
}
输出:
End Main
destructor called
destructor called
delete 运算导致析构函数调用
Ctest * pTest;
pTest = new Ctest; //构造函数调用
delete pTest; //析构函数调用
------------------------------------------------------------------
pTest = new Ctest[3]; //构造函数调用3次
delete [] pTest; //析构函数调用3次
析构函数调用时机的问题
class Demo {
int id;
public:
Demo( int i )
{
id = i;
cout << “id=” << id << “ Constructed” << endl;
}
~Demo()
{
cout << “id=” << id << “ Destructed” << endl;
}
};
Demo d1(1);
void Func(){
static Demo d2(2);
Demo d3(3);
cout << “Func” << endl;
}
int main (){
Demo d4(4);
d4 = 6;
cout << “main” << endl;
{
Demo d5(5);
}
Func();
cout << “main ends” << endl;
return 0;
}
输出:
id=1 Constructed
id=4 Constructed
id=6 Constructed
id=6 Destructed
main
id=5 Constructed
id=5 Destructed
id=2 Constructed
id=3 Constructed
Func
id=3 Destructed
main ends
id=6 Destructed
id=2 Destructed
id=1 Destructed
"{}" 表示在其作用域内调用,出了作用域就“消亡”
static 静态变量消亡在程序结束时。
最后是我在碰见的一个问题
int main()
{
A *p = new A[2];
A *p2 = new A;
A a;
delete p;
}
//问:析构函数调用了几次?
答案是 3
因为new出来的对象,需要程序员自己delete,析构函数不被调用