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的析构函数之前及其它所有对象撤销之后。

时间: 09-01

C++中构造函数和析构函数的调用顺序的相关文章

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

http://blog.csdn.net/xw13106209/article/details/6899370 1.参考文献 参考1: C++继承中构造函数.析构函数调用顺序及虚函数的动态绑定 参考2: 构造函数.拷贝构造函数和析构函数的的调用时刻及调用顺序 参考3: C++构造函数与析构函数的调用顺序 2.构造函数.析构函数与拷贝构造函数介绍 2.1构造函数 构造函数不能有返回值 缺省构造函数时,系统将自动调用该缺省构造函数初始化对象,缺省构造函数会将所有数据成员都初始化为零或空 创建一个对象

c++学习笔记5,多重继承中派生类的构造函数与析构函数的调用顺序(二)

现在来测试一下在多重继承,虚继承,MI继承中虚继承中构造函数的调用情况. 先来测试一些普通的多重继承.其实这个是显而易见的. 测试代码: //测试多重继承中派生类的构造函数的调用顺序何时调用 //Fedora20 gcc version=4.8.2 #include <iostream> using namespace std; class base { public: base() { cout<<"base created!"<<endl; }

【C/C++】构造函数与析构函数的调用顺序

常见问题 Q1. 以下代码的输出结果是什么? 1 #include <iostream> 2 using namespace std; 3 4 class A 5 { 6 public: 7 A() { cout << "A" << endl; } 8 ~A() { cout << "~A" << endl; } 9 }; 10 class B : public A 11 { 12 public: 13 B

C++:派生类的构造函数和析构函数的调用顺序

一.派生类 在C++编程中,我们在编写一个基类的派生类时,大致可以分为四步: ? 吸收基类的成员:不论是数据成员还是函数成员,派生类吸收除基类的构造函数和析构函数之外的全部成员. ? 改造基类函数:在派生类中声明一个或多个与其(某个)基类中的成员函数同名的成员函数,并将它(们)根据新的需求进行重写 ? 发展新的成员:在派生类中添加新的成员变量和成员函数,其中新添加的成员要求必须和基类中的成员不同名,并且应当保证新添加的成员会使派生类在功能上相比其基类有所发展 ? 重写派生类的构造函数和析构函数

c++学习笔记4,派生类的构造函数与析构函数的调用顺序(一)

測试源代码: //測试派生类的构造函数的调用顺序何时调用 //Fedora20 gcc version=4.8.2 #include <iostream> using namespace std; class base { public: base() { cout<<"base created!"<<endl; } ~base() { cout<<"base destroyed!"<<endl; } };

派生类的构造函数与析构函数的调用顺序

派生类构造函数各部分的执行次序为1.调用基类的构造函数,按他们在派生类定义的先后顺序,顺序调用.2.调用成员对象的构造函数,按他们在类定义中声明的先后顺序,顺序调用3.派生类的构造函数体中的操作 在派生类构造函数中,只要基类不是使用缺省构造函数,都要显式给出基类名和参数表如果基类没有定义构造函数,则派生类也可以不定义,全部采用系统给定的缺省构造函数.如果基类定义了带有形参表的构造函数时,派生类就应当定义构造函数. //Test1.h #include<iostream> using names

C++中多态中构造函数与析构函数的调用

做个实验,看一下成员变量的构造析构,父类子类的构造析构,以及虚函数对调用的影响. 1 #include <iostream> 2 using namespace std; 3 4 class Member 5 { 6 public: 7 Member(int n):m_n1(n) 8 { 9 cout<<"Member::Member("<<m_n1<<")"<<endl; 10 } 11 ~Member(

类的构造函数与析构函数的调用顺序

先来段代码: 1 #include <iostream> 2 using namespace std; 3 4 class Clock{ 5 private: 6 int H,M,S; 7 public: 8 Clock(int h=0,int m=0,int s=0){ 9 H=h,M=m,S=s; 10 cout<<"constructor:"<<H<<":"<<M<<":&quo

继承中參数传递及调用顺序

一.简单派生类的构造函数传參 C++语言的继承特性,指子类能够继承父类的属性和行为,并能够又一次定义或加入新的属性和行为. 父类中为private型的属性和行为尽管被继承,可是子类中仍不能訪问.在继承机制下.构造函数是不能被继承的,所以基类构造函数的參数要由子类构造函数传. 单一继承的子类构造函数的声明(.h中)形式为: 派生类构造函数名(參数总表) (); 单一继承的子类构造函数的定义(.cpp中)形式为: 派生类名::派生类构造函数名(參数总表) : 基类构造函数名 (參数名表) { 派生类