【问题标题】:Why a zeroed member of a built-in type on default member initialization? [duplicate]为什么在默认成员初始化时内置类型的零成员? [复制]
【发布时间】:2020-12-15 21:01:55
【问题描述】:

我想知道为什么这段代码的输出是零:

#include <iostream>    

class C
{
public:
    int m;
    C() {}
};

int main ()
{ 
    C c;
    std::cout << c.m << '\n';
    return 0;
}

我一直认为,当构造函数初始化列表中没有提到内置类型的成员时,它不会被初始化。此外,在调试模式下构建时,结果是我所期望的——一些非零值。为什么我在发布模式下得到零而在调试中却没有?为什么我会得到零?

【问题讨论】:

标签: c++ class object initialization default


【解决方案1】:

int 只能包含整数值。那么假设的“统一价值”应该是什么?

因此,对于 C++ 中的整数来说,未初始化的含义是该值不能以任何方式得到保证。有时可能为 0。其他时候可能是其他整数值。进行一些代码更改后,未初始化的值可能会有所不同。它可能与程序上的一次运行不同。或者它可能看起来保持不变,偶然。没有任何保证。

在调试模式下,编译器可能会尝试通过将其设置为不寻常的值来帮助您识别它未初始化的事实。

【讨论】:

  • int 不一定只能包含整数值。 int 类型可以(在 C++20 之前)在末尾包含未使用的位。这样的位可以用来表示未初始化的int,这似乎是合理的。
  • 有趣。我没有考虑过 C++ 标准在理论上是否允许这样的事情。尽管在实践中,我认为这不是实施的可能选择。
猜你喜欢
  • 2013-10-14
  • 2019-09-10
  • 2015-03-22
  • 1970-01-01
  • 2021-06-13
  • 2012-08-29
  • 1970-01-01
  • 2021-12-16
  • 1970-01-01
相关资源
最近更新 更多