包含已声明但未初始化的项目的初始化列表

Initialization list with items declared but not initialized

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

假设我有以下代码:

class Example {
  int a, b, c;

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

我知道成员的初始化顺序是由它们的声明顺序定义的,而不是由它们在初始化列表中列出的顺序定义的,但是,如果我没有 b 在初始化列表中如下?

class Example {
  int a, b, c;

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

a 是否会用 1b 和未定义的值初始化 c3?我是否会因为没有严格按照声明的顺序调用初始化列表而出现未定义的行为?还是这个的none?

我问这个是因为我有一个 class 有很多数据,我想确保其中一些有初始值,但我不需要初始化所有数据。

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

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

#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 的值不应该被信任。您还应该收到一条警告消息:

Constructor does not initialize these fields: b

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