0

在我的课堂上,我使用了这样的字段:

private:
bool firstSeqNumReceived;

一段时间内一切正常,但在一次提交后,我发现 now 字段是true默认的。令人惊讶的是,默认情况下字段未初始化false,而是分配的值取决于实现(有关更多详细信息,请参阅什么是 C++ 类成员的默认值

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

4

3 回答 3

5

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

因为编译器假设你知道你在做什么。

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

于 2013-04-15T11:27:27.400 回答
0

用例基本上是,如果您使用变量,它取决于程序流程。如果您不在部分代码中使用它,则也无需对其进行零初始化。

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

于 2013-04-15T11:25:46.357 回答
0

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

int x;
std::cin >> x;

x由于0值会立即被覆盖,因此自动初始化是完全没有意义的。初始化变量的权力掌握在有能力的人手中。

编译器还可能假设您不会调用未定义的行为来进行优化。

于 2013-04-15T11:26:55.767 回答