在我的课堂上,我使用了这样的字段:
private:
bool firstSeqNumReceived;
一段时间内一切正常,但在一次提交后,我发现 now 字段是true
默认的。令人惊讶的是,默认情况下字段未初始化false
,而是分配的值取决于实现(有关更多详细信息,请参阅什么是 C++ 类成员的默认值)
现在我想知道为什么编译器不会产生编译时错误,迫使我添加初始化?谁需要“依赖于实现”的默认值,是否有任何用例?在这种情况下为什么不产生编译时错误?
在我的课堂上,我使用了这样的字段:
private:
bool firstSeqNumReceived;
一段时间内一切正常,但在一次提交后,我发现 now 字段是true
默认的。令人惊讶的是,默认情况下字段未初始化false
,而是分配的值取决于实现(有关更多详细信息,请参阅什么是 C++ 类成员的默认值)
现在我想知道为什么编译器不会产生编译时错误,迫使我添加初始化?谁需要“依赖于实现”的默认值,是否有任何用例?在这种情况下为什么不产生编译时错误?
我想知道为什么编译器不会产生编译时错误,迫使我添加初始化?
因为编译器假设你知道你在做什么。
在 C++ 中,您无需为不使用的东西付费。可能存在初始化浪费时间的用例。例如,在一个类中,在构造对象之前不可能计算成员的真正有意义的值,将成员初始化为某个默认值或标记值几乎没有什么作用。
用例基本上是,如果您使用变量,它取决于程序流程。如果您不在部分代码中使用它,则也无需对其进行零初始化。
此外,如果您知道该值将在构造函数或其他一些成员函数中分配,那么首先将 0 写入内存只是一个多余的步骤。
该标准规定访问未初始化的对象是未定义的行为。这种未定义的行为出现在标准中有几个原因。这更多是关于不给你比你要求的更多的东西。有时您真的不想在创建变量后立即对其进行初始化。相反,编译器信任您在需要初始化对象时对其进行初始化。作为您不希望它自动初始化的示例:
int x;
std::cin >> x;
x
由于0
值会立即被覆盖,因此自动初始化是完全没有意义的。初始化变量的权力掌握在有能力的人手中。
编译器还可能假设您不会调用未定义的行为来进行优化。