我有一些疑问,建设和初始化,以便保证在C++。例如,以下代码中有四个类 X, Y, ZW.主要的功能,例化的一个目的 class X, ,其中包含一个目的 class Y, 和来自 class Z, ,这样两个构造将被称为。此外, const char* 参传递给 X's构造将隐含地转变为一个目的 class W, ,所以 W's构造也必须呼吁。

什么是保证所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
有帮助吗?

解决方案

在所有的类构造顺序有保证:基类,如从左至右依次通过按照该次序成员变量指定在类定义声明。一旦它的所有的碱和成员的构造的完成被执行的类的构造体。

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

是需要的临时W传递到X的构造,所以它的x的构造开始之前被构造和将一次x完成的初始化被破坏。

因此,程序必须进行打印:

W
Z
Y
X

其他提示

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

2)然后基类被构造

3)然后成员在外观中的类的声明的顺序构成的。

4)然后X的构造被称为

  1. W目将以前建造的构造,以X。
  2. Z,作为一个基X类的,将被初始化成员面前X.
  3. Y会initalized在成员初始化
  4. X的构造运行。

要扩大查尔斯贝利的回答,当你的基类虚拟继承规则的改变。我总是忘记的顺序是什么,IBM网站上说,虚拟基地首先被初始化,但我从来没有碰到它实际上超过琐事的情况下。

为了总结这些是规则:

  1. 论点,采取了从右向左
    a.最正确的
    b.2从右
  2. 基类
  3. 虚拟基础
  4. 基类从左至右
  5. 成员为了宣言中的类
  6. 构造的称为类
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top