在C ++ 98中
12.6.2 / 4 :在完成对类X的构造函数的调用之后,如果在构造函数的 mem-initializers 中未指定X的成员,也没有默认初始化,也没有在构造函数体的执行过程中初始化,该成员具有不确定的值。
在执行构造函数体的过程中初始化是什么意思?成员是否可以在构造函数体内初始化?
答案 0 :(得分:11)
也没有在构造函数体的执行过程中初始化是不正确的恕我直言。
C ++ 03中的措辞已经从或初始化(在C ++ 98中)更改为,也没有给出值
在完成对类X的构造函数的调用之后,如果在构造函数的mem-initializers中既没有指定X的成员,也没有在default-initialized中指定,也没有在value-initialized中指定,也没有给出值在执行构造函数体时,该成员具有不确定的值。
答案 1 :(得分:3)
实际上非常简单。 class / struct成员可以包含具有默认构造函数的对象,但如果它们不包含,并且您不打算在初始化列表中为它们赋值,也不在构造函数的主体内设置它们,那么基本上就是它们的内存占用 - 无论是从堆栈还是堆中为它们争吵 - 仍然会有旧垃圾,即不确定的价值。
考虑:
struct X
{
X() : x1(1) { x2 = 2; }
double x1, x2, x3;
std::string x4;
};
此处x1
和x2
由X
的构造函数显式初始化,x4
- 为std::string
- 默认构造为“ “/ length 0. x3
,但是,可以是任何东西 - 并且不应该在它被设置之后读取它(它是未定义的行为并且真的可以咬一些系统 - 考虑它的内存位模式吧占用甚至可能不是double的有效值,因此从中读取可能会触发一些CPU异常/陷阱/中断)。