首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >默认初始化不能正常工作

默认初始化不能正常工作
EN

Stack Overflow用户
提问于 2018-07-24 10:00:51
回答 1查看 176关注 0票数 0
代码语言:javascript
复制
class Example{

public:
int k;
};

int main(){
Example *ex = new Example();
Example *ex1 = new Example;
}

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

代码语言:javascript
复制
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,而不是未定义的行为。对吧?

EN

回答 1

Stack Overflow用户

发布于 2018-07-24 10:19:21

“未定义行为”意味着编译器可以做任何事情,.Which是这样说的:当您单击未定义的行为时,编译器将完全在其权限范围内使恶魔从您的鼻子鼻恶魔.Thankfully中飞出,在您的情况下,它选择打印0。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51495791

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档