理解C ++标准的困惑

时间:2010-12-08 04:00:33

标签: c++ standards

在C ++ 98中

  

12.6.2 / 4 :在完成对类X的构造函数的调用之后,如果在构造函数的 mem-initializers 中未指定X的成员,也没有默认初始化,也没有在构造函数体的执行过程中初始化,该成员具有不确定的值。

在执行构造函数体的过程中初始化是什么意思?成员是否可以在构造函数体内初始化

2 个答案:

答案 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;
};

此处x1x2X的构造函数显式初始化,x4 - 为std::string - 默认构造为“ “/ length 0. x3,但是,可以是任何东西 - 并且不应该在它被设置之后读取它(它是未定义的行为并且真的可以咬一些系统 - 考虑它的内存位模式吧占用甚至可能不是double的有效值,因此从中读取可能会触发一些CPU异常/陷阱/中断)。