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
相关产品推荐
相关产品推荐

