【问题标题】:Initialisation in Member Initializer List [duplicate]成员初始化器列表中的初始化[重复]
【发布时间】:2015-09-25 08:39:36
【问题描述】:
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.

【问题讨论】:

  • @Barry 我认为重复没有多大意义,因为它没有解决构造函数主体和默认初始化的问题,这是这个问题的关键,并且在你的重复中根本不起作用提及。我没有发现任何明显与此重复的东西,这就是为什么我没有立即回答 b/c 我以为我会找到一些东西。

标签: c++ initialization


【解决方案1】:

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

C++ 标准草案供参考:

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

[...]

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

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

如果您没有在构造函数的主体中为b 赋值,它将有一个不确定的值

为了澄清answer you mentioned,您似乎所指的部分答案是:

如果你使用赋值,那么这些字段将首先被初始化为 默认构造函数,然后重新分配(通过赋值运算符) 与实际值。

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

如果没有为对象指定初始化器,则该对象是 默认初始化。当使用自动或 获取动态存储时长,对象有一个不确定的 值,并且如果没有对对象执行初始化,则 对象保留一个不确定的值,直到该值被替换 (5.17)。

注意using an indeterminate value is undefined behavior

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 你介意回答我的第二个问题(更新)
    • 成员abint 类型的变量,它是内置类型。因此,它们没有任何“默认”构造函数,如果它们未在初始化列表中初始化,则会隐式调用该构造函数。变量b 根本不会在初始化列表中初始化。
    • @JerryGoyal b 将被默认初始化(这对于int 意味着什么都不会发生并且它将具有不确定的值),然后它将被分配3
    • 哦!我明白了..它不适合原始人
    猜你喜欢
    • 2015-02-28
    • 2016-06-23
    • 2011-07-14
    • 2015-04-27
    • 2015-02-07
    • 2015-11-28
    • 1970-01-01
    • 1970-01-01
    • 2019-09-10
    相关资源
    最近更新 更多