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的析构函数之前及其它所有对象撤销之后。
C++中构造函数和析构函数的调用顺序的更多相关文章
- C++学习笔记(7)----类的数组中构造函数和析构函数的调用顺序
C++类的数组中构造函数和析构函数的调用顺序(2) 对于如下的代码: #include<iostream> using namespace std; class CBase { priva ...
- C++C++中构造函数与析构函数的调用顺序
http://blog.csdn.net/xw13106209/article/details/6899370 1.参考文献 参考1: C++继承中构造函数.析构函数调用顺序及虚函数的动态绑定 参考2 ...
- C++ 构造函数和析构函数的调用顺序、虚析构函数的作用
构造函数和析构函数的调用顺序 构造函数的调用顺序: 当建立一个对象时,首先调用基类的构造函数,然后调用下一个派生类的构造函数,依次类推,直至到达最底层的目标派生类的构造函数为止. 析构函数的调用书序: ...
- C++继承,多重继承,虚继承的构造函数以及析构函数的调用顺序问题
#include <iostream> using namespace std; class A{ int data_a; public: A(){ data_a = ; cout < ...
- C++:派生类的构造函数和析构函数的调用顺序
一.派生类 在C++编程中,我们在编写一个基类的派生类时,大致可以分为四步: • 吸收基类的成员:不论是数据成员还是函数成员,派生类吸收除基类的构造函数和析构函数之外的全部成员. • 改造基类函数:在 ...
- C++构造函数和析构函数的调用顺序
1.构造函数的调用顺序 基类构造函数.对象成员构造函数.派生类本身的构造函数 2.析构函数的调用顺序 派生类本身的析构函数.对象成员析构函数.基类析构函数(与构造顺序正好相反) 3.特例 局部对象,在 ...
- c++学习笔记4,派生类的构造函数与析构函数的调用顺序(一)
測试源代码: //測试派生类的构造函数的调用顺序何时调用 //Fedora20 gcc version=4.8.2 #include <iostream> using namespace ...
- C++中多态中构造函数与析构函数的调用
做个实验,看一下成员变量的构造析构,父类子类的构造析构,以及虚函数对调用的影响. #include <iostream> using namespace std; class Member ...
- c++中的类(构造函数,析构函数的执行顺序)
类对象的初始化顺序 新对象的生成经历初始化阶段(初始化列表显式或者隐式的完成<这部分有点像java里面的初始化块>)——> 构造函数体赋值两个阶段 1,类对象初始化的顺序(对于没有父 ...
随机推荐
- Lights inside a 3d Grid UVA - 11605(概率)
题意: 给出一个n * m * h的空间 每次任意选择两个点 使得在以这两个点连线为对角线的空间的点的值 取反 (初始为0) 求经过k次操作后最后有多少点的值为1 解析: 遇到坐标分维去看 把三 ...
- Android ListView 列表视图
列表显示的三个元素 ListView : 用来显示列表的View Adapter : 适配器 用来把数据映射到ListView 上的中介 Data: 数据 将被映射的字符串,图片或者基本组件等资源 根 ...
- 简易版AC自动机
为什么说是简易版? 因为复杂度大概是\(O(M*\overline N)\),而似乎还有另一种大概是\(O(M+\sum N)\)的. 不过据说比赛不会卡前一种做法,因为模式串一般不会很长. 那么步入 ...
- 青蛙跳台阶(C、Python)
C语言: /* ----------------------------------- 当n = 1, 只有1中跳法:当n = 2时,有两种跳法:当n = 3 时,有3种跳法:当n = 4时,有5种跳 ...
- 【bzoj3064】 CPU监控
http://www.lydsy.com/JudgeOnline/problem.php?id=3064 (题目链接) 题意 给出一个长度为$n$的数列$A$,同时定义一个辅助数组$B$,$B$开始与 ...
- 【Linux】fg、bg让你的进程在前后台之间切换
Linux下的fg和bg命令是进程的前后台调度命令,即将指定号码(非进程号)的命令进程放到前台或后台运行.比如一个需要长时间运行的命令,我们就希望把它放入后台,这样就不会阻塞当前的操作:而一些服务型的 ...
- A1097. Deduplication on a Linked List
Given a singly linked list L with integer keys, you are supposed to remove the nodes with duplicated ...
- Java: 在不同windows主题下,JFrame窗口设置最佳高度的解决方案
//设置窗口的大小,无论使用怎样的windows主题,都能灵活的应对,显示合适的窗口大小,一定要在JFrame.setVisible(true)之前调用, //替代传统的frame.setSize(w ...
- promise用法详解
es6的promise可谓是异步书写的一大福音,过去异步js书写是函数嵌套函数的方式,promise出现后书写异步js代码就变得美观得多了 以前的写法:回调函数不停嵌套 ajax('/banners' ...
- 20190311 Java处理JSON的常用类库
1. Gson 1.1. 背景 谷歌 1.2. 简单使用 Gson gson = new Gson(); System.out.println(gson.toJson(1)); // ==> 1 ...