当我没有初始化所有项目时,我有一个关于初始化列表的问题。
假设我有以下代码:
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会用1初始化,b用未定义的值初始化,c使用3E 213初始化?如果没有严格按照我声明的顺序调用初始化列表,我会得到一个未定义的行为吗?还是什么都不做?
我之所以问这个问题,是因为我有一个包含大量数据的类,我希望确保其中一些类有一个初始值,但我不需要初始化所有这些数据。
发布于 2018-11-07 23:31:18
不初始化初始化程序列表中的成员不会导致未定义的行为。读它是一种不明确的行为。未初始化的int将默认初始化,从而使其处于不确定状态。
发布于 2018-11-07 23:44:41
未定义行为的概念取决于这里的上下文。关键是您的代码不应该信任非初始化变量的值。例如,考虑这段代码(从示例中扩展):
#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
考虑到清除代码中的警告消息是一个很好的实践,您不应该使用这种方法开发严肃的项目。
https://stackoverflow.com/questions/53199440
复制相似问题