默认初始化无法正常工作

Default initialization doesn't work properly

本文关键字:工作 常工作 初始化 默认      更新时间:2023-10-16
class Example{
public:
int k;
};
int main(){
Example *ex = new Example();
Example *ex1 = new Example;
}

根据我到目前为止所读到的内容,在ex的情况下,变量k将被值初始化,这意味着等于0,而ex1将被默认初始化,对于int这样的基本类型,它意味着未定义的行为,但不是0。问题是,当我打印时

cout << ex->k << endl;
cout <<  ex1->k << endl;

它为两者打印0。为什么?

编辑:根据C++标准-零初始化T类型的对象意味着:

--如果T是标量类型(3.9(,则将对象设置为转换为T的值0(零(
--如果T是非并集类类型,则每个非静态数据成员和每个基类子对象初始化为零
--如果T是并集类型,则对象的第一个命名数据成员初始化为零
--如果T是数组类型,则每个元素初始化为零
--如果T是引用类型,则不执行初始化。

默认初始化T类型的对象意味着:
-如果T是非POD类类型(子句9(,则调用T的默认构造函数(如果T没有可访问的默认构造函数,则初始化格式错误(
--如果T是数组类型,则默认初始化每个元素
--否则,对象初始化为零。

对T类型的对象进行值初始化意味着:
-如果T是一个具有用户声明构造函数(12.1(的类类型(第9条(,则调用T的默认构造函数(如果T没有可访问的默认构造函数,则初始化格式错误(
--如果T是一个没有用户声明构造函数的非并集类类型,则T的每个非静态数据成员和基类组件都被值初始化
--如果T是数组类型,则每个元素都被值初始化
--否则,对象为零初始化

现在情况看起来有点不同,在ex1的情况下,我们有默认初始化,它是POD类,而不是数组,所以对象是零初始化的,那么-如果T是非并集类类型,每个非静态数据成员和每个基类子对象都是零初始化;这意味着k将被初始化为0,并且它不是未定义的行为。正确的

"未定义行为"意味着编译器可以做任何事情。也就是说,当你遇到未定义行为时,编译器将完全有权让恶魔从你的鼻子里飞出来。谢天谢地,在您的情况下,它选择打印0。