2010-03-25 48 views
9

我对C++中的构造和初始化顺序保证有些怀疑。例如,下面的代码有四个类X,Y,ZW。主函数实例化一个对象class X,它包含一个对象class Y,并从class Z派生,所以这两个构造函数都会被调用。此外,传递给X的构造函数的const char*参数将隐式转换为class W的对象,因此还必须调用W的构造函数。C++:构造和初始化顺序保证

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; 
} 

编辑:这是正确的吗?

W  | 
/ \ | 
Z  Y | 
\ / | 
    X  V 
+1

的顺序将是W舱的, Z,Y,X但我不确定具体规则。 – 2010-03-25 16:00:47

+0

Y和W之间的关系是什么? – curiousguy 2015-08-26 08:21:01

回答

15

在所有类中,构造顺序都是保证的:基类,从左到右依次指定,后面跟着类定义中声明的顺序的成员变量。一旦完成了所有基地和成员的建筑,一个类的构造函数体将被执行。

在您的例子XZ衍生和包含Y所以Z基础对象首先构造,则Y构件y,则X的建设完成与X的构造体的执行。

临时W需要传递到X构造函数,所以构造之前x的建设开始,将再次的x完成初始化被破坏。

所以程序必须打印:

W 
Z 
Y 
X 
6

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

2)然后构造基类。

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

4)然后X的构造被称为

+0

只是添加...基类也是按照从左到右的顺序构造的,它们在继承时出现 – 2010-03-25 17:17:37

+0

@Yogesh,当然,谢谢 – 2010-03-25 17:49:05

2
  1. 将W对象称为构造函数X之前将构造。
  2. Z,作为基类是X,将X的
  3. ý将initalized成员之前构件初始化
  4. X的构造将运行期间初始化。
2

要在查尔斯贝利的回答扩大,当你的基类虚拟继承规则的改变。我经常忘记命令是什么,IBM网站说,虚拟基地首先被初始化,但我从来没有遇到过这种情况,它实际上不仅仅是琐事。

2

总结这些规则:

  1. 参数,从右到左
    拍摄的。最右边
    b。右二
  2. 基类,左
  3. 虚拟基础
  4. 基类权
  5. 成员在声明的顺序类
  6. 构造称为