析构函数

  • 作为成员函数的一种,用于在对象消亡时做一些释放空间的善后工作。
  • 与构造函数对应,但是一个类只有一个。
  • 名字与类名相同,在前面加“~”。
  • 缺省的析构函数不涉及释放用户申请的内存释放等清理工作

对象数组的每个元素的析构函数都会被调用

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,析构函数不被调用

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容