C++未初始化整数成员输出随机值?为何不符合零初始化预期
为什么你的C++类成员没有被零初始化?
你代码里的问题出在初始化方式上,咱们拆解来看:
你写的
A c;属于默认初始化。对于A这种没有自定义构造函数的类,默认初始化会对每个成员执行默认初始化——而C++里的基本类型(int、uint16_t这类)默认初始化的行为是不做任何初始化,所以成员a和b会保留内存里的原有垃圾值,输出自然是随机数。你提到的“整数基本类型会被零初始化”是有前提条件的:
- 全局/静态存储期的对象(比如在
main函数外面定义的A c;)会被自动零初始化 - 使用值初始化语法时,比如
A c{};或者A c = A();,类的成员会被值初始化,基本类型就会被置零 - 用
new A();这种方式动态分配对象时,也会触发零初始化
- 全局/静态存储期的对象(比如在
关于你说的“类成员会调用构造函数”:基本类型确实存在默认构造函数,但这个构造函数的行为就是什么都不做——只有当对象被要求值初始化或零初始化时,基本类型才会被设置为0。
给你改个示例,这样就能得到零输出:
#include <cstdint> #include <iostream> class A { public: int a; uint16_t b; }; int main () { using namespace std; A c{}; // 值初始化 cout << c.a << endl; // 输出0 cout << c.b << endl; // 输出0 }
内容的提问来源于stack exchange,提问作者user129393192
相关产品推荐
相关产品推荐

