page contents

C++新手入门--析构函数详解

析构函数是类的一个成员函数,名字由波浪号接类名构成,没有...


01 什么是析构函数


析构函数是类的一个成员函数,名字由波浪号接类名构成,没有返回值,不接受参数,一个类只一个析构函数。创建对象时系统会自动调用构造函数进行初始化工作,同样,销毁对象时系统也会自动调用一个函数来进行清理工作,例释放分配的内存、关闭打开的文件等,这个函数就是析构函数。


注意:析构函数没有参数,不能被重载,因此一个类只能有一个析构函数。如果用户没有定义,编译器会自动生成一个默认的析构函数。


attachments-2021-03-ZOvaGzkJ6061758b6adf3.jpg


02 析构函数完成什么工作


在构造函数中,成员的初始化时在函数体执行前完成的,且按照他们在类中的顺序进行初始化。在析构函数中,先执行函数体,再按照初始化顺序的逆序销毁成员。


析构函数销毁类类型成员时执行成员自己的析构函数,内置类型(包括指针)则什么也不做,智能指针是类类型,会被自动销毁。


attachments-2021-03-kTEW64Li6061759b52506.jpg


03 析构函数什么时候被调用


  • 变量在离开其作用域时被销毁。

  • 当一个对象被销毁时,其成员被销毁。

  • 容易起被销毁时,其元素也被销毁。

  • 对于动态分配的对象,当对指向它的指针使用delete运算符时被销毁。

  • 对于临时对象,创建它的完整表达式结束时被销毁。


派生类在销毁时,派生类的析构函数先执行,再是基类的析构函数,以此类推,沿着继承体系的反方向直到最后。

attachments-2021-03-ZlcxZWlh606175a843fcd.jpg

04 析构函数的执行时机

析构函数在对象被销毁时调用,而对象的销毁时机与它所在的内存区域有关。在所有函数之外创建的对象是全局对象,它和全局变量类似,位于内存分区中的全局数据区,程序在结束执行时会调用这些对象的析构函数。

在函数内部创建的对象为局部对象,它和局部变量类似,位于栈区,函数执行结束时会调用这些对象的析构函数。

new 创建的对象位于堆区,通过 delete 删除时才会调用析构函数;如果没有 delete,析构函数就不会被执行。

下面的例子演示了析构函数的执行。



  1. #include <iostream>

  2. #include <string>

  3. using namespace std;

  4. class Demo{

  5. public:

  6. Demo(string s);

  7. ~Demo();

  8. private:

  9. string m_s;

  10. };

  11. Demo::Demo(string s): m_s(s){ }

  12. Demo::~Demo(){ cout<<m_s<<endl; }

  13. void func(){

  14. //局部对象

  15. Demo obj1("1");

  16. }

  17. //全局对象

  18. Demo obj2("2");

  19. int main(){

  20. //局部对象

  21. Demo obj3("3");

  22. //new创建的对象

  23. Demo *pobj4 = new Demo("4");

  24. func();

  25. cout<<"main"<<endl;

  26. return 0;

  27. }

运行结果:
1
main
3
2

attachments-2021-03-7Wp2lVPb60617573b9da2.jpg

  • 发表于 2021-03-29 14:41
  • 阅读 ( 863 )
  • 分类:C/C++开发

0 条评论

请先 登录 后评论
小柒
小柒

1478 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1478 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章