Class POD 成员默认初始化与零初始化与无初始化?
Class POD members default-initialization vs. zero-initialization vs. no-initialization?
关于这个主题有很多问题,但其中很多使用了不准确的术语,而且答案大多是片面的。我将尝试以另一种方式提出问题,并希望对这个常见问题提出一个完美的答案。
在PODs的情况下,默认初始化和零初始化之间有什么区别?
如果一个成员POD变量没有在构造函数初始化列表中初始化,那么会是:
- 零初始化。
- 默认初始化(如果与上面不同)。
- 未初始化。
上面问题2的答案是否取决于class的实例是使用new
运算符在堆栈上还是在堆上创建的
上述任何问题的答案对于 C++98、C++11 或 C++14 是否不同?
在默认初始化中,基本 "C" 风格的类型(int、double、char、bool 等)具有不确定的值。也就是说,没有未定义的行为,但值可以是任何值。
如果 POD 成员未在构造函数中初始化,也未通过 C++11 in-class 初始化,则默认初始化。
无论栈还是堆,答案都是一样的
在 C++98(而不是之后)中,new int()
被指定为执行零初始化。
参考:http://en.cppreference.com/w/cpp/language/default_initialization
关于这个主题有很多问题,但其中很多使用了不准确的术语,而且答案大多是片面的。我将尝试以另一种方式提出问题,并希望对这个常见问题提出一个完美的答案。
在PODs的情况下,默认初始化和零初始化之间有什么区别?
如果一个成员POD变量没有在构造函数初始化列表中初始化,那么会是:
- 零初始化。
- 默认初始化(如果与上面不同)。
- 未初始化。
上面问题2的答案是否取决于class的实例是使用
new
运算符在堆栈上还是在堆上创建的上述任何问题的答案对于 C++98、C++11 或 C++14 是否不同?
在默认初始化中,基本 "C" 风格的类型(int、double、char、bool 等)具有不确定的值。也就是说,没有未定义的行为,但值可以是任何值。
如果 POD 成员未在构造函数中初始化,也未通过 C++11 in-class 初始化,则默认初始化。
无论栈还是堆,答案都是一样的
在 C++98(而不是之后)中,
new int()
被指定为执行零初始化。
参考:http://en.cppreference.com/w/cpp/language/default_initialization