简单来说,其构造函数的顺序就一句话:

基类构造函数 -> 成员的构造函数 -> 构造函数体内语句

看下面一个代码示例:

#include <iostream>using namespace std;class A {public:A() { cout << "A()" << endl; }~A() { cout << "~A()" << endl; }
};class B {public:B(int b) { cout << "B(" << b << ")" << endl; }~B() { cout << "~B()" << endl; }
};class C {public:C(int c) { cout << "C(" << c << ")" << endl; }~C() { cout << "~C()" << endl; }
};class D {public:D() { cout << "D()" << endl; }~D() { cout << "~D()" << endl; }
};class E: public B, public A {public:D d;C c;E(): c(3), B(5) { cout << "E()" << endl; }~E() { cout << "~E()" << endl; }
};int main()
{E e;return 0;
}

你能看出这份代码的输出吗?

依照上面提到的,首先应该执行的是基类的构造函数。不过 C++ 语言是支持多继承的,那么当某个类继承多个类时,其构造顺序又是怎样的呢?答案是:简单的依照继承的顺序构造。

接下来,就会执行其成员变量的构造函数,这个顺序也很简单,就是依照类代码中成员变量的顺序依次执行的。

最后才会执行构造函数中的具体代码。

注意,在上述过程中,执行的顺序与构造函数参数的顺序无关。

通过 new 创建一个对象会调用其构造函数,通过 delete 删除一个对象会调用其析构函数。

如果没有显示的使用 delete 删除一个对象的话,析构函数执行的顺序与构造函数的顺序相反。

所以,上述代码的输出就是:

B(5)
A()
D()
C(3)
E()
~E()
~C()
~D()
~A()
~B()

原文链接:http://conw.net/archives/51/

C++构造函数及析构函数的调用顺序相关推荐

  1. c++构造函数和析构函数的调用顺序研究

    构造函数与析构函数的调用顺序 构造函数与析构函数的调用顺序 构造函数与析构函数的调用顺序 1)当类中有成员变量是其它类的对象时,首先调用成员变量的构造函数,调用顺序与声明顺序相同:之后调用自身类的构造 ...

  2. 实验3.1 定义一个CPU类,观察构造函数和析构函数的调用顺序

    题目 定义一个CPU类,包含等级(rank).频率(frequency).电压(voltage)等属性,有两个公有成员函数run.stop.其中,rank为枚举类型CPU_Rank,定义为enum C ...

  3. 构造函数和析构函数的调用顺序

    目录 构造函数和析构函数 构造函数 复制构造函数 析构函数 构造函数与析构函数的调用顺序 单继承 多继承 构造函数和析构函数 构造函数 构造函数是特殊的成员函数,与类同名,没有返回类型,而且允许重载. ...

  4. 继承关系中构造函数、析构函数的调用顺序详解

    构造函数: 在c++中,当声明一个派生类的对象时,派生类中包含所有父类的数据成员以及自己添加的数据成员均已被分配了内存,只是尚未进行初始化配置(但实际上基本数据类型的变量已经被赋予随机默认值). 构造 ...

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

    情况一:类B继承类A 结论一:定义变量时:先调用父类的构造函数,再调用派生类的构造函数:变量销毁时:先调用派生类的析构函数,再调用父类的析构函数. #include <iostream> ...

  6. 构造函数和析构函数的调用过程

    下面代码的输出是什么?(D) class A { public: A() { } ~A() { cout<<"~A"<<endl; } }; class B ...

  7. C++类继承时构造函数与析构函数的执行顺序

    C++类继承时构造函数与析构函数的执行顺序 在C++类中,类A继承类B时,如果创建一个A的对象时,会首先调用基类的构造函数,再调用派生类的构造函数,而析构函数的执行相反,但是当基类和派生类分别有一个成 ...

  8. 构造函数及析构函数的调用

    构造函数以及析构函数的调用 #include <iostream> using namespace std; class Person { public:Person(){cout < ...

  9. (c++)5.4构造函数和析构函数中调用虚函数

    在构造函数和析构函数中调用虚函数时,采用静态联编(他们所调用的虚函数是自己类中定义的函数) 如果在自己类中没有实现这个虚函数,则调用的是基类中的虚函数,绝不会是任何在派生类中重定义的虚函数 //构造函 ...

最新文章

  1. python 词云_利用Python生成词云
  2. mysql数据库增左右连接_快速增加MYSQL数据库连接数负载能力
  3. linux定时器错误使用,linux下定时器的使用
  4. [译] 想帮助用户做决定?你的APP可以这样设计!
  5. 红外倒车雷达原理图_汽车里的毫米波雷达你知多少?
  6. win10护眼模式_电脑技巧|Win10系统如何设置护眼模式?
  7. ios sdk 穿山甲_GitHub - ArthurKnight/flutter_ad_pangolin_plugin: iOS flutter 穿山甲插件
  8. linux c 获取 多个硬盘序列号_veket系统中使用GParted进行硬盘分区
  9. 智能实验室-杀马(Defendio) 4.11.0.790
  10. 交易系统开发(六)——HFT高频交易
  11. SAS基础-日期时间本质
  12. IDEA搭建SpringMVC+Spring+Mybatis项目
  13. 概率 无穷数列求和公式
  14. 知乎2019新知青年大会:用问题改变世界的方向
  15. Android:异步处理之Handler+Thread的应用(一)
  16. Win10家庭版获得管理员权限的方法
  17. CAPM模型的应用--回归模型中的Alpha, r_f
  18. ZDNET的一个技术博客评选结果
  19. python语音识别库kaldi_Kaldi 语音识别基础教程
  20. 【数字图像处理】双三次插值及其卷积算法(Bicubic Interpolation)

热门文章

  1. python需要电脑配置-python3批量统计用户电脑配置
  2. 案例驱动python编程入门-事件驱动程序
  3. python导入csv文件-python如何导入csv文件格式
  4. python入门经典例题-Python入门_列表练习题
  5. 自学python推荐书籍 知乎-在知乎上学 Python - 爬虫篇
  6. python使用pip安装本地包-python搭建本地pip源,离线安装python模块
  7. python怎么读文件名-python读取文件名并改名字的实例
  8. python入门教程书-清华大学出版社-图书详情-《Python快速入门精讲》
  9. python的工作方向-python工作方向,发展方向?
  10. c语言有参有类最小公倍数,C语言求最大公约数和最小公倍数算法