【发布时间】: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