当前位置: 首页 > news >正文

C++中构造函数和析构函数的调用顺序

 

一般而言,析构函数调用的顺序和构造函数调用顺序相反,但是,对象的存储类别可以改变调用析构函数的顺序。举例说明:

CreateAndDestroy类的定义

 

CreateAndDestroy类的成员函数的定义

 

测试函数

 

构造函数和析构函数的调用顺序:

分析

  全局作用域内定义的对象的构造函数,在文件内任何其他函数(包括main函数)开始执行之前调用,当main函数执行结束时,相应的析构函数被调用,如上面的Object 1.

exit函数迫使程序立即结束,不执行自动对象的析构函数。当程序中检测到输入中有错误,或者程序要处理的文件不能打开时,常常使用exit函数来终止程序。abort函数的执行情况与exit

函数类似,但是迫使程序立刻终止,不允许调用任何对象的析构函数。通常使用abort函数指示程序的非正常终止。

  当程序执行到自动局部对象的定义处时,该对象的构造函数被调用;当程序执行离开对象的作用域时,相应的析构函数被调用。如果程序的终止是由调用exit函数或者abort函数完成,

那么自动对象的析构函数将不被调用。

  static 局部对象的构造函数只调用一次,即在程序第一次执行到该对象的定义处时;而相应的析构函数的调用则发生在main函数结束或者程序调用exit函数。全局或静态对象的的撤销

顺序与它们建立的顺序正好相反。abort函数的调用终止程序时,static对象的析构函数将不被调用。

  在测试函数的第10行定义了全局static对象first, 在main中任何语句执行之前,调用它的构造函数;而在运行所有其他对象的析构函数之后程序终止,调用它的析构函数。

  对象second和fourth都是局部自动对象,对象third是一个static局部对象。当程序执行到每个对象声明处时,调用它们的构造函数;当程序执行到main函数结尾时,依次调用对象fourth和second的析构函数(与构造函数的调用顺序相反)。因为对象third是static局部对象,所以直到程序终止时,他才撤销,即对象third的析构函数在全局对象first的析构函数调用之前、在所有其它对象撤销之后调用。

  第25行的create函数声明了3个对象:fifth和senventh是局部自动对象,sixth是局部static对象。程序执行到create函数结尾时,依次调用对象seventh和fifth的析构函数(与构造函数调用的顺序相反)。由于sixth是static,因此直到程序终止时它才撤销。sixth的析构函数的调用发生在third和first的析构函数之前及其它所有对象撤销之后。

转载于:https://www.cnblogs.com/90zeng/p/cpp_construtor_destructor.html

相关文章:

  • [20150904]exp slow.txt
  • 数字填空
  • c/c++ 软件集成 安装和可卸载软件
  • 【云分析】《“支持和运维服务”仍然困扰着企业云的应用》
  • 前端工程师技能之photoshop巧用系列第四篇——图片格式
  • serialVersionUID的作用
  • 判断客户端类型,Android,iOS,PC
  • 2015年最新数据库流行排行榜
  • android 调用jni 的简单步骤
  • 做图表统计你需要掌握SQL Server 行转列和列转行
  • Centos7安装Xmind
  • svn的终端使用
  • [KMP求最小循环节][HDU1358][Period]
  • Ajax与json在前后端中的细节解惑
  • SQL Server相关书籍
  • 【译】JS基础算法脚本:字符串结尾
  • 收藏网友的 源程序下载网
  • cookie和session
  • ECMAScript6(0):ES6简明参考手册
  • If…else
  • JavaScript设计模式与开发实践系列之策略模式
  • JS基础之数据类型、对象、原型、原型链、继承
  • JS字符串转数字方法总结
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • nfs客户端进程变D,延伸linux的lock
  • php ci框架整合银盛支付
  • puppeteer stop redirect 的正确姿势及 net::ERR_FAILED 的解决
  • Sublime Text 2/3 绑定Eclipse快捷键
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • webgl (原生)基础入门指南【一】
  • windows下使用nginx调试简介
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 测试如何在敏捷团队中工作?
  • 关于Java中分层中遇到的一些问题
  • 好的网址,关于.net 4.0 ,vs 2010
  • 使用权重正则化较少模型过拟合
  • 线上 python http server profile 实践
  • 由插件封装引出的一丢丢思考
  • 说说我为什么看好Spring Cloud Alibaba
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • #HarmonyOS:基础语法
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (第8天)保姆级 PL/SQL Developer 安装与配置
  • (附源码)springboot“微印象”在线打印预约系统 毕业设计 061642
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (一)基于IDEA的JAVA基础12
  • (转)LINQ之路
  • .NET CORE Aws S3 使用
  • .Net6使用WebSocket与前端进行通信
  • .NET国产化改造探索(一)、VMware安装银河麒麟
  • @select 怎么写存储过程_你知道select语句和update语句分别是怎么执行的吗?
  • [ vulhub漏洞复现篇 ] JBOSS AS 5.x/6.x反序列化远程代码执行漏洞CVE-2017-12149
  • []sim300 GPRS数据收发程序