46

在下面的代码中,当调用 ctor 时,会先调用orX的 ctor吗?它们在类主体中的放置顺序是否控制了这一点?如果有人可以提供一段来自 C++ 标准的文本片段来讨论这个问题,那将是完美的。AB

class A {};
class B {};
class X
{
 A a;
 B b;
};
4

2 回答 2

76

顺序是它们出现在类定义中的顺序 - 这是来自 C++ 标准的第 12.6.2 节:

5 初始化应按以下顺序进行:

— 首先,并且仅对于如下所述的最派生类的构造函数,虚拟基类应按照它们在基类的有向无环图的深度优先从左到右遍历中出现的顺序进行初始化,其中“从左到右”是派生类基说明符列表中基类名称的出现顺序。

— 然后,直接基类应按照它们出现在 base-specifier-list 中的声明顺序进行初始化(无论 mem-initializers 的顺序如何)。

— 然后,非静态数据成员应按照它们在类定义中声明的顺序进行初始化(同样不管 mem-initializers 的顺序)。

— 最后,构造函数的主体被执行。[注意:声明顺序是为了确保基子对象和成员子对象以初始化的相反顺序被销毁。]

于 2010-04-19T18:41:12.080 回答
14

初始化始终按照类成员出现在类定义中的顺序进行,因此在您的示例中a,则为b

每个成员的初始化之间都有一个序列点,您可以将对尚未初始化的成员的引用传递给类成员的构造函数,但您只能以有限的方式使用它(例如获取其地址来形成一个指针),其他用途很可能会导致未定义的行为。

类成员的销毁总是以与构造相反的顺序发生。

基和成员的初始化顺序在 12.6.2 [class.base.init]/5 中定义。

于 2010-04-19T18:37:19.433 回答