成员初始化列表中的初始化

时间:2015-07-07 17:39:33

标签: c++ initialization

class A
{
  public:
    int a ,b;
    A() : a(1)
    {
      b=3;
    }
};

如果我们创建此类的对象:

A obj;

然后首先初始化哪一个ab

在分配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.

2 个答案:

答案 0 :(得分:3)

mem-initializer 首先按照它们在类定义中声明的顺序执行,然后执行构造函数的主体。

作为参考,C ++标准草案说:

  

在非委托构造函数中,初始化按以下顺序进行:

     

[...]

     
      
  • 然后,按照在类定义中声明的顺序初始化非静态数据成员   (再次与mem-initializers的顺序无关)。

  •   
  • 最后,执行构造函数体的复合语句

  •   

如果你没有在构造函数体中为b赋值,那么它将具有不确定值

要从answer you mentioned澄清,您似乎指的答案部分是:

  

如果您使用赋值,则首先使用   默认构造函数然后重新分配(通过赋值运算符)   与实际值。

它们的意思是它将默认初始化,在 int 的情况下,意味着来自草案C ++标准的不确定值:

  

如果没有为对象指定初始化程序,则该对象为   默认初始化。使用自动或自动存储对象时   获得动态存储持续时间,该对象具有不确定性   值,如果没有为对象执行初始化,那么   对象保留不确定的值,直到替换该值   (5.17)。

请注意using an indeterminate value is undefined behavior

答案 1 :(得分:2)

初始化顺序始终是声明变量的顺序,与mem-initializers的顺序无关。所以a然后b