【C++】类构造函数、析构函数的调用顺序「完整版」 |
您所在的位置:网站首页 › 构造函数调用函数 › 【C++】类构造函数、析构函数的调用顺序「完整版」 |
一、全局变量、静态变量和局部变量
全局变量在程序开始时调用构造函数、在程序结束时调用析构函数。 静态变量在所在函数第一次被调用时调用构造函数、在程序结束时调用析构函数,只调用一次。 局部变量在所在的代码段被执行时调用构造函数,在离开其所在作用域(大括号括起来的区域)时调用析构函数。可以调用任意多次。 下面我们通过代码进行更详细的讲解: #include using namespace std; // 下面定义三个类,在调用构造、析构函数时进行输出 class A { public: A() { cout public: B() { cout public: C() { cout cout cout cout public: Base2() { cout public: Member1() { cout public: Member2() { cout public: // 先定义一个Member2的对象,再定义一个Member1的对象 Member2 m2; Member1 m1; // 定义派生类的构造函数 Derived(): m1(), m2(), Base1(), Base2() // 与定义时相反,按照Member1、Member2、Base1、Base2初始化对象 { cout Derived d; return 0; }执行结果: + Constructor of Base2 + Constructor of Base1 + Constructor of Member2 + Constructor of Member1 + Constructor of Derived - Destructor of Derived - Destructor of Member1 - Destructor of Member2 - Destructor of Base1 - Destructor of Base2结论: 先调用基类的构造函数再调用子对象类(成员变量)的构造函数最后调用派生类的构造函数调用顺序与派生类构造函数冒号后面给出的初始化列表(Derived(): m1(), m2(), Base1(), Base2())没有任何关系,按照继承的顺序和变量再类里面定义的顺序进行初始化。 先继承Base2,就先构造Base2。先定义m2,就先构造m2。析构函数调用顺序仍然与构造函数构造顺序相反。(这一段有点绕,可以暂停思考一下) 那么我们岂不是可以把两部分结合一下?出一道毒瘤C++题? 例 写出下面的程序的输出。 #include using namespace std; class Base1 { public: Base1() { cout public: Base2() { cout public: Member1() { cout public: Member2() { cout public: Member2 m2; Member1 m1; Derived(): m1(), m2(), Base1(), Base2() { cout static Member1 m1; { Base2 b2; Base1 b1; } static Member2 m2; } int main() { for(int i = 1; i |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |