类 POD 成员默认初始化与零初始化与无初始化
Class POD members default-initialization vs. zero-initialization vs. no-initialization?
关于
这个话题有很多问题,但其中许多使用不准确的术语,答案大多是部分的。我将尝试以另一种方式提出这个问题,并希望对这个常见问题提出一个完美的答案。
- 对于
POD,默认初始化和零初始化之间有什么区别(如果有的话)?
如果成员 POD 变量未在构造函数初始化列表中初始化,在这种情况下,它将是:
- 零初始化。
- 默认初始化(如果与上述不同)。
- 未初始化。
上述问题 2 的答案是否取决于类的实例是在堆栈上创建的,还是使用
new
运算符在堆上创建的对于 C++98,C++11 或 C++14,上述任何问题的答案是否不同?
-
在默认初始化中,基本的"C"样式类型(int、double、char、bool 等)具有不确定的值。 也就是说,没有未定义的行为,但值可以是任何内容。
-
如果 POD 成员未在构造函数中初始化,也未通过 C++11 类内初始化进行初始化,则默认初始化。
-
无论堆栈还是堆,答案都是一样的。
-
在 C++98 中(而不是之后),
new int()
被指定为执行零初始化。
参考: http://en.cppreference.com/w/cpp/language/default_initialization
相关文章:
- 初始化具有非默认构造函数的std::数组项的更好方法
- 有没有一种代码密度较低的方法来使用非默认构造函数初始化数组?
- 副本初始化的默认模板参数推导
- 使用 std::分配器在 constexpr 中进行默认初始化
- 在C++中使用默认构造函数初始化对象的不同方法
- 强制使用默认构造函数对成员进行未初始化的声明
- 使用默认构造函数初始化对象的不同方法
- 在没有默认构造函数时使用垃圾数据初始化对象
- 为什么对象默认初始化,但基元不在C++?
- 默认参数和空列表初始化
- 为什么std::atomic的默认构造函数不默认初始化底层存储值
- C++中未初始化成员布尔变量的默认值是多少?
- 两个成员,在Base中默认初始化,可能在Derived中非默认初始化
- 默认初始化无法正常工作
- 如何用默认值0或-1初始化unordered_set
- C++11 默认类成员初始化与初始值设定项列表同时
- 使用聚合初始化模拟默认函数参数是否存在任何陷阱?
- 初始化在类类型 #define 中定义的非静态成员数组,不带默认 ctor
- 在皮条类中初始化默认值的最佳位置
- 值初始化:默认初始化或零初始化