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。为什么?
编辑:根据标准-到零初始化T类型的对象意味着:
-如果T是标量类型(3.9),则将对象设置为转换为T的0(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,而不是未定义的行为。对吧?
发布于 2018-07-24 10:19:21
“未定义行为”意味着编译器可以做任何事情,.Which是这样说的:当您单击未定义的行为时,编译器将完全在其权限范围内使恶魔从您的鼻子鼻恶魔.Thankfully中飞出,在您的情况下,它选择打印0。
https://stackoverflow.com/questions/51495791
复制相似问题