C++ 类数据成员的初始化顺序

C++ 类数据成员的初始化顺序,c++,initialization,class-members,C++,Initialization,Class Members,在下面的代码中,当调用X的ctor时,是否首先调用A或B的ctor?它们在类主体中的放置顺序是否控制了这一点?如果有人能提供一个C++代码的文本片段来讨论这个问题,那就太完美了。 class A {}; class B {}; class X { A a; B b; }; 初始化总是按照类成员在类定义中出现的顺序进行的,因此在示例中是a,然后是b 每个成员的初始化之间都有一个序列点,您可以将对尚未初始化成员的引用传递到类成员的构造函数中,但您只能以有限的方式使用它(例如以其地址形成指针),

在下面的代码中,当调用
X
的ctor时,是否首先调用
A
B
的ctor?它们在类主体中的放置顺序是否控制了这一点?如果有人能提供一个C++代码的文本片段来讨论这个问题,那就太完美了。
class A {};
class B {};
class X
{
 A a;
 B b;
};

初始化总是按照类成员在类定义中出现的顺序进行的,因此在示例中是
a
,然后是
b

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

类成员的破坏总是以与构造相反的顺序发生


基和成员初始化顺序在122.2[class .Base.init ]/5中定义。< /P> < P>顺序是它们在类定义中出现的顺序-这是从C++标准的第12.2节:

5初始化应在以下步骤中进行: 顺序如下:

-首先,而且仅限于 最派生的 类,如下所述,虚拟基 类应在 按深度优先显示的顺序排列 从左到右遍历 基的有向无环图 类,其中“从左到右”是 基类的出现顺序 派生类中的名称 基本说明符列表

-那么,直接 基类应在中初始化 声明顺序,正如它们出现在 基本说明符列表(不考虑 mem初始值设定项的顺序)

-然后,应创建非静态数据成员 按照它们被初始化的顺序初始化 在类定义中声明 (再次强调,无论程序的顺序如何 mem初始值设定项)

-最后是身体 执行构造函数的。[注: 申报令的任务是: 确保基本子对象和成员子对象 按相反的顺序销毁 初始化。]


你能提供一个引用吗?要补充一点,如果你有一个像这样的X的构造函数-X():b(),a(){}a仍然是先初始化的。我知道这一点。我要一份推荐信。我自信地对一个要求推荐人的人说了这句话,但我找不到推荐人。所以问题就来了。@Nikhil:我只是在检查参数。现在加上。@Nikhil:如果你知道这一点,为什么要问这个问题?为什么不直接询问推荐人而不是询问你已经知道的事情呢?