class A
{
public:
int a ,b;
A() : a(1)
{
b=3;
}
};
如果我们创建此类的对象:
A obj;
然后首先初始化哪一个a
或b
?
在分配b = 3
的过程中,是否会涉及默认构造函数?我指的是提供的答案:If you use assignment then the fields will be first initialized with default constructors and then reassigned (via assignment operator) with actual values.
答案 0 :(得分:3)
mem-initializer 首先按照它们在类定义中声明的顺序执行,然后执行构造函数的主体。
作为参考,C ++标准草案说:
在非委托构造函数中,初始化按以下顺序进行:
[...]
然后,按照在类定义中声明的顺序初始化非静态数据成员 (再次与mem-initializers的顺序无关)。
最后,执行构造函数体的复合语句
如果你没有在构造函数体中为b
赋值,那么它将具有不确定值。
要从answer you mentioned澄清,您似乎指的答案部分是:
如果您使用赋值,则首先使用 默认构造函数然后重新分配(通过赋值运算符) 与实际值。
它们的意思是它将默认初始化,在 int 的情况下,意味着来自草案C ++标准的不确定值:
如果没有为对象指定初始化程序,则该对象为 默认初始化。使用自动或自动存储对象时 获得动态存储持续时间,该对象具有不确定性 值,如果没有为对象执行初始化,那么 对象保留不确定的值,直到替换该值 (5.17)。
答案 1 :(得分:2)
初始化顺序始终是声明变量的顺序,与mem-initializers的顺序无关。所以a
然后b
。