如果没有初始化类字段,为什么在c ++中没有编译时错误?

时间:2013-04-15 11:23:06

标签: c++

在我班上我使用的是这样的领域:

private:
bool firstSeqNumReceived;

一切都运行良好一段时间但是在一次提交之后我发现默认情况下现在字段为true。令人惊讶的是,默认情况下,字段未初始化为false,而是指定的值取决于实现(有关详细信息,请参阅What is the default value for C++ class members

现在我想知道为什么编译器不会产生编译时错误,迫使我添加初始化? 谁需要“依赖于实现”的默认值,是否有任何用例?为什么不在这种情况下产生编译时错误?

3 个答案:

答案 0 :(得分:5)

  

我想知道为什么编译器不会产生编译时错误强迫我   添加初始化?

因为编译器假设您知道自己在做什么。

在C ++中,您不需要为不使用的内容付费。可能存在初始化浪费时间的用例。例如,在构造对象之前无法计算成员的真实有意义值的类中,将成员初始化为某个默认值或标记值几乎没有。

答案 1 :(得分:0)

用例基本上是,如果您使用变量,它取决于程序流程。如果您不在代码的某些部分中使用它,那么也不需要将其初始化为零。

另外如果你知道,这个值将在构造函数或其他一些成员函数中分配,那么首先将0写入内存只是一个多余的步骤。

答案 2 :(得分:0)

该标准指定访问未初始化对象是未定义的行为。标准中出现这种未定义行为的原因有几个。这个更多是关于不给你超过你要求的。有时您真的不想在创建变量时立即初始化变量。相反,编译器信任您在初始化需要时初始化对象。作为您不希望它自动初始化的示例:

int x;
std::cin >> x;

自动将x初始化为0是完全没有意义的,因为该值会立即被覆盖。初始化变量的能力掌握在你的能力之中。

编译器也可能假设您没有调用未定义的行为以进行优化。