C++;:建造和初始化订单保证 我对C++中的构造和初始化顺序保证有一些怀疑。例如,以下代码有四个类X、Y、Z和W。main函数实例化一个类X的对象,该对象包含一个类Y的对象,并派生自类Z,因此将调用这两个构造函数。此外,传递给X的构造函数的const char*参数将隐式转换为类W的对象,因此也必须调用W的构造函数 P>对复制构造函数调用的顺序,C++标准给出了什么保证?或者,等价地,这个程序可以打印什么 #include <iostream> class Z { public: Z() { std::cout << "Z" << std::endl; } }; class Y { public: Y() { std::cout << "Y" << std::endl; } }; class W { public: W(const char*) { std::cout << "W" << std::endl; } }; class X : public Z { public: X(const W&) { std::cout << "X" << std::endl; } private: Y y; }; int main(int, char*[]) { X x("x"); return 0; }

C++;:建造和初始化订单保证 我对C++中的构造和初始化顺序保证有一些怀疑。例如,以下代码有四个类X、Y、Z和W。main函数实例化一个类X的对象,该对象包含一个类Y的对象,并派生自类Z,因此将调用这两个构造函数。此外,传递给X的构造函数的const char*参数将隐式转换为类W的对象,因此也必须调用W的构造函数 P>对复制构造函数调用的顺序,C++标准给出了什么保证?或者,等价地,这个程序可以打印什么 #include <iostream> class Z { public: Z() { std::cout << "Z" << std::endl; } }; class Y { public: Y() { std::cout << "Y" << std::endl; } }; class W { public: W(const char*) { std::cout << "W" << std::endl; } }; class X : public Z { public: X(const W&) { std::cout << "X" << std::endl; } private: Y y; }; int main(int, char*[]) { X x("x"); return 0; },c++,constructor,initialization-order,C++,Constructor,Initialization Order,1) 首先,需要计算参数 2) 然后构造基类 3) 然后按照类声明中出现的顺序构造成员 4) 然后调用X的构造函数 将在调用X的构造函数之前构造W对象 Z、 作为X的基类,将在X的成员之前初始化 Y将在成员初始化期间初始化 X的构造函数将运行 在所有类中,构造顺序都是有保证的:从左到右指定的基类,后跟类定义中声明的顺序中的成员变量。类的构造函数体在其所有基和成员的构造完成后执行 在您的示例中,X派生自Z并包含Y,因此首先构造Z基本对象,然后构造Y成员Y,然后执行X的构造函数体,从而完成X的构造

1) 首先,需要计算参数

2) 然后构造基类

3) 然后按照类声明中出现的顺序构造成员

4) 然后调用X的构造函数

  • 将在调用X的构造函数之前构造W对象
  • Z、 作为X的基类,将在X的成员之前初始化
  • Y将在成员初始化期间初始化
  • X的构造函数将运行

  • 在所有类中,构造顺序都是有保证的:从左到右指定的基类,后跟类定义中声明的顺序中的成员变量。类的构造函数体在其所有基和成员的构造完成后执行

    在您的示例中,
    X
    派生自
    Z
    并包含
    Y
    ,因此首先构造
    Z
    基本对象,然后构造
    Y
    成员
    Y
    ,然后执行
    X
    的构造函数体,从而完成
    X
    的构造

    临时
    W
    需要传递给
    X
    的构造函数,因此它是在
    X
    的构造开始之前构造的,并且在
    X
    的初始化完成后将被销毁

    因此,程序必须打印:

    W
    Z
    Y
    X
    

    要扩展Charles Bailey的答案,当基类被虚拟继承时,规则会发生变化。我总是忘记顺序是什么,IBM网站上说虚拟基础首先初始化,但我从来没有遇到过这样的情况,即虚拟基础实际上不仅仅是琐事。

    总结一下这些规则:

  • 参数,从右向左取
    A.最右边的
    B右二
  • 基类
  • 虚拟基地
  • 从左到右的基类
  • 成员在课堂上按顺序发言
  • 被调用类的构造函数

  • 顺序是W,Z,Y,X,但我不确定具体的规则。Y和W之间的关系是什么?只是补充一下。。。基类也按继承时从左到右的顺序构造
    W
    Z
    Y
    X