当我不初始化所有项目时,我对初始化列表有疑问。
假设我有以下代码:
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。 ?因为我没有严格按照声明的顺序调用初始化列表,我是否会得到未定义的行为?还是没有?
之所以问这个问题,是因为我有一个包含大量数据的类,并且我想确保其中的一些具有初始值,但是我不需要初始化所有的值。
答案 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
考虑到从代码中清除警告消息是一种好习惯,因此您不应该使用这种方法来开发严肃的项目。