【问题标题】:Default initialization doesn't work properly [duplicate]默认初始化无法正常工作[重复]
【发布时间】:2018-12-31 21:49:02
【问题描述】:
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),则将对象设置为值0(零)转换为T;
— 如果 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只是它的一种变体。
  • *ex1 有一个不确定值(本身不是未定义的行为,但可能导致 UB)。这意味着值可以是任何东西。包括它可以是 0。由于它不是 unsigned char,该值的另一​​种可能性是陷阱表示,这可能会导致在访问它时发生不希望的事情。或者它可能是完全随机的,或者是一个依赖于编译器的特殊位模式,用于填充未初始化的内存。
  • From what I have read so far, in the case of ex variable k will be value initialized 你能指出你在哪里读到这篇文章吗?
  • @KillzoneKid 首先回答这里 - stackoverflow.com/questions/8106016/…
  • @loannnlo 谢谢

标签: c++ initialization default


【解决方案1】:

“未定义的行为”意味着编译器可以做任何事情。也就是说,当你遇到未定义的行为时,编译器完全有权让恶魔飞出你的鼻子nasal demons。谢天谢地,在你的如果它选择打印 0。

【讨论】:

  • 它实际上已经定义,但不确定。这不允许鼻恶魔,但确实允许值 0。如果可以的话,我会投一半的赞成票。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-06
  • 2017-12-30
  • 1970-01-01
  • 2017-09-14
  • 1970-01-01
相关资源
最近更新 更多