C++:建设和初始化,以便保证
-
22-09-2019 - |
题
我有一些疑问,建设和初始化,以便保证在C++。例如,以下代码中有四个类 X
, Y
, Z
和 W
.主要的功能,例化的一个目的 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
解决方案
在所有的类构造顺序有保证:基类,如从左至右依次通过按照该次序成员变量指定在类定义声明。一旦它的所有的碱和成员的构造的完成被执行的类的构造体。
在您的例子X
从Z
衍生和包含Y
所以Z
基础对象首先构造,则Y
构件y
,然后用X
的构造体的执行X
完成的结构。
是需要的临时W
传递到X
的构造,所以它的x
的构造开始之前被构造和将一次x
完成的初始化被破坏。
因此,程序必须进行打印:
W
Z
Y
X
其他提示
1)首先,它需要计算的参数。
2)然后基类被构造
3)然后成员在外观中的类的声明的顺序构成的。
4)然后X的构造被称为
- W目将以前建造的构造,以X。
- Z,作为一个基X类的,将被初始化成员面前X.
- Y会initalized在成员初始化
- X的构造运行。
要扩大查尔斯贝利的回答,当你的基类虚拟继承规则的改变。我总是忘记的顺序是什么,IBM网站上说,虚拟基地首先被初始化,但我从来没有碰到它实际上超过琐事的情况下。
为了总结这些是规则:
- 论点,采取了从右向左
a.最正确的
b.2从右 - 基类
- 虚拟基础
- 基类从左至右
- 成员为了宣言中的类
- 构造的称为类
不隶属于 StackOverflow