C++:构造和初始化顺序保证

Gio*_*hal 12 c++ constructor initialization-order

我对C++中的构造和初始化顺序保证有些怀疑.例如,下面的代码有四个班X,Y,ZW.main函数实例化一个对象class X,该对象包含一个对象class Y,并从中派生出来class Z,因此将调用两个构造函数.另外,const char*传递给X构造函数的参数将被隐式转换为对象class W,因此W也必须调用构造函数.

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;
}
Run Code Online (Sandbox Code Playgroud)

编辑:这是对的吗?

   W      |
 /   \    |
Z     Y   |
 \   /    |
   X      V
Run Code Online (Sandbox Code Playgroud)

CB *_*ley 18

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

在你的例子X中派生Z和包含Y所以Z首先构造基础对象,然后构造Y成员y,然后构造X完成并执行X构造函数体.

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

所以程序必须打印:

W
Z
Y
X
Run Code Online (Sandbox Code Playgroud)


Ale*_*tov 7

1)首先,需要计算参数.

2)然后构造基类.

3)然后按照班级声明中的出现顺序构建成员.

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