我对 C++ 中的构造和初始化顺序保证有一些疑问。例如,下面的代码有四个类X
, Y
, Z
and W
。 main函数实例化一个对象class X
,其中包含一个对象class Y
,并且源自class Z
,因此两个构造函数都会被调用。此外,const char*
参数传递给X
的构造函数将隐式转换为对象class W
, so 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;
}
编辑:这是正确的吗?
W |
/ \ |
Z Y |
\ / |
X V
在所有类中,构造顺序都是有保证的:基类,从左到右指定,后面是按照类定义中声明的顺序的成员变量。一旦类的所有基类和成员的构造完成,类的构造函数主体就会被执行。
在你的例子中X
源自Z
并包含Y
so the Z
首先构造基础对象,然后构造Y
member y
,然后构建X
执行完成X
的构造函数主体。
临时的W
需要传递给构造函数X
,因此它是在构建之前构建的x
开始并在初始化后被销毁x
完成。
所以程序必须打印:
W
Z
Y
X
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)