You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中类的int成员在三种new实例化场景下是否被零初始化?

C++中Foo类成员m的初始化情况分析

嘿,这个问题绝对是C++初始化规则里的经典坑,我来给你逐个拆解清楚:

  • 场景A:auto foo = new Foo;
    这里用的是默认初始化。因为Foo没有用户自定义的构造函数,编译器会生成默认构造函数,但这个默认构造函数对内置类型成员m只会做默认初始化——也就是完全不初始化它!所以m的值是未定义的,绝对不能依赖它是零,运行时可能是任何随机值。

  • 场景B:auto foo = new Foo();
    这是值初始化的写法。当你用()来初始化类对象,而类没有用户声明的构造函数时,编译器会先对所有非静态成员进行零初始化,再完成值初始化。所以这里的m会被保证置为0,是确定的。

  • 场景C:auto foo = new Foo{};
    这是C++11引入的列表初始化(也叫统一初始化)。对于这种没有用户定义构造函数的类,列表初始化的行为和值初始化完全一致——同样会先零初始化所有内置类型成员,所以m也会被保证是0。

总结一下:只有A场景的m是未定义的,B和C场景都能保证m被初始化为0。

内容的提问来源于stack exchange,提问作者juzzlin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:59:59