析构函数的调用------新标准c++程序设计
发布日期:2022-04-04 06:36:20 浏览次数:10 分类:博客文章

本文共 1252 字,大约阅读时间需要 4 分钟。

示例1:

#include
using namespace std;class CDemo{ public: ~CDemo(){cout<<"destructor"<

输出结果:

funcdestructortestdestructorafter testdestructordestructor

  程序工输出destructor四次。第一次是由于Func函数结束时,参数对象obj消亡导致的。第二次是因为:第20行调用Test函数,Test函数的返回值是一个临时对象,该临时对象在函数调用所在的语句结束时就消亡了,因此引发析构函数调用。第三次是main函数结束时d2消亡导致的。第四次是整个程序结束时全局对象d1消亡导致的。

 

示例2:

#include
using namespace std;class Demo{ int id;public: Demo(int i){id=i;cout<<"id="<
<<"constructed"<

输出结果:

id=1constructedid=4constructedid=6constructedid=6destructedmainid=5constructedid=5destructedid=2constructedid=3constructedfuncid=3destructedmain endsid=6destructedid=2destructedid=1destructed

  要分析程序的输出,首先要看看有没有全局对象。因为全局对象是进入main函数以前就形成的,所以全局对象在main函数开始执行前就会被初始化。本程序第9行定义了全局对象d1,因此d1初始化引发的构造函数调用,导致了第1行的输出结果。

  main函数开始执行后,局部对象d4初始化,导致第2行的输出。

  第18行,“d4=6;”,6先被自动转化成一个临时对象。这个临时对象的初始化导致第3行的输出。临时对象的值被赋给d4后,这条语句执行完毕,临时对象消亡,因此引发析构函数调用,导致第4行输出。

  第21行的d5初始化导致第6行输出。d5的作用域和生存期都只到离它最近的,且将其包含在内的那一对“{}”中的"}"为止,即第22行的"}",因此程序执行到第22行时d5消亡,引发析构函数被调用,输出第7行。

  第8行的输出是由于进入Func函数后,执行第11行的静态局部对象d2初始化导致的静态局部对象在函数第一次调用并执行到定义它的语句时初始化,生存期一直持续到整个程序结束,所以即使Func函数调用结束,d2也不会消亡。Func函数中的d3初始化导致了第9行输出。第23行,Func函数调用结束后,d3消亡导致第11行输出。

  main函数结束时,其局部变量d4消亡,导致第13行输出。整个程序结束时,全局变量d1和静态局部变量d2消亡,导致最后两行输出。

 

新标准c++程序设计

转载请注明出处

转载地址:https://www.cnblogs.com/l2017/p/7758408.html 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:类型转换构造函数 及使用explicit避免类型自动转换------新标准c++程序设计
下一篇:复制构造函数被调用的三种情况------新标准c++程序设计

发表评论

最新留言

做的很好,不错不错
[***.243.131.199]2024年04月09日 18时01分52秒