为啥在默认成员初始化时内置类型的零成员? [复制]

Posted

技术标签:

【中文标题】为啥在默认成员初始化时内置类型的零成员? [复制]【英文标题】: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;

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

【问题讨论】:

评论不用于扩展讨论;这个对话是moved to chat。 【参考方案1】:

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

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

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

【讨论】:

int 不一定只能包含整数值。 int 类型可以(在 C++20 之前)在末尾包含未使用的位。这样的位可以用来表示未初始化的int,这似乎是合理的。 有趣。我没有考虑过 C++ 标准在理论上是否允许这样的事情。尽管在实践中,我认为这不是实施的可能选择。

以上是关于为啥在默认成员初始化时内置类型的零成员? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥就地成员初始化在 C++11 中使用复制构造函数?

我可以防止非 POD 类中数组数据成员中元素的零初始化吗?

为啥可以删除任何函数,但只能删除默认的特殊成员函数? [复制]

全局对象内的内置类型的成员变量是不是已初始化为零?

为啥结构的大小不等于其各个成员类型的大小之和? [复制]

默认初始化值初始化