具有已声明但未初始化的项目的初始化列表

时间:2018-11-07 23:26:58

标签: c++ initialization list-initialization

当我不初始化所有项目时,我对初始化列表有疑问。

假设我有以下代码:

class Example {
  int a, b, c;

  Example() : a(1), b(2), c(3) {}
}

我知道成员的初始化顺序是由成员的声明顺序决定的,而不是由成员在初始化列表中列出的顺序决定的,但是如果我没有 b < / strong>在初始化列表中,如下所示?

class Example {
  int a, b, c;

  Example() : a(1), c(2) {}
}

a 初始化为 1 ,将 b 初始化为未定义值,将 c 初始化为 3。 ?因为我没有严格按照声明的顺序调用初始化列表,我是否会得到未定义的行为?还是没有?

之所以问这个问题,是因为我有一个包含大量数据的类,并且我想确保其中的一些具有初始值,但是我不需要初始化所有的值。

2 个答案:

答案 0 :(得分:3)

不初始化初始化列表中的成员不会导致未定义的行为。读取它是不确定的行为。未初始化的int将被默认初始化,从而使其处于不确定状态。

答案 1 :(得分:1)

未定义行为的想法取决于此处的上下文。关键是您的代码不应信任未初始化变量的值。例如,考虑这段代码(从您的示例扩展而来):

#include <iostream>

class Example {
public:
    int a, b, c;
    Example() : a(1), c(2) {}
};

void print(const Example& e) {
    std::cout << e.a << ' ' << e.b << ' ' << e.c << '\n';
}

int main()
{
    Example e, f, g;
    print(e);
    print(f);
    print(g);
    return 0;
}

运行它,我得到:

1 32766 2
1 0 2
1 0 2

因此,显然b的值不应该被信任。您还应该收到一条警告消息,内容为:

  

构造函数不会初始化以下字段:b

考虑到从代码中清除警告消息是一种好习惯,因此您不应该使用这种方法来开发严肃的项目。