2013-01-10 76 views
14

我昨天才知道,指定初始值设定项目的参数是可选的。但是,在这种情况下会发生什么规则?C++初始值设定项列表中的默认值

在下面的例子中,将ptr初始化为0,切换为false,并且Bar默认构造?我猜这个问题有点多余,因为如果未指定参数值==未定义行为,那么初始化程序列表中会有点小问题。

我还可以指出C++标准中声明初始化程序列表项没有被赋予参数情况下的行为部分吗?

class Bar 
{ 
    Bar() { } 
}; 

class SomeClass; 
class AnotherClass 
{ 
public: 
    SomeClass *ptr; 
    bool toggle; 
    Bar bar; 

    AnotherClass() : ptr(), toggle(), bar() { } 
    // as opposed to... 
    // AnotherClass() : ptr(NULL), toggle(false), bar(Bar()) { } 
}; 
+0

[构造函数初始化列表空初始化]的可能重复(https://stackoverflow.com/questions/11164394/constructor-initialization-list-with-empty-initialization) – Justin

回答

12

是的,成员将分别初始化为零和默认构造的对象。

的C++ 11标准规定此问题在12.6.2/7:

在MEM-初始化表达式列表或支撑-INIT-列表用于 初始化指定子对象(或,在 委托构造函数的情况下,完整的类对象)根据初始化规则为 的直接初始化。

反过来,8.5/10读取:

其初始化为空集括号的一个目的,即(), 应值初始化。

段落8.5/7限定值初始化

要值初始化类型T的对象是指:

  • 如果T是一个(可能是CV-合格)类型(第9章)与用户提供的构造函数 (12.1),然后调用T的默认构造函数(如果T没有可访问的默认值,则 初始化不合格3210构造函数);
  • 如果T是一个(可能CV修饰)非工会类类型 无需用户提供的构造函数,则该对象是 零初始化,并且如果T的隐式声明的缺省构造 是不平凡的,那构造函数被调用。
  • 如果T是一个数组类型,则 然后每个元素都进行了值初始化;
  • 否则,对象是 零初始化。

最后,8.5/5限定零初始化

要零初始化对象或类型T的参考是指:

  • 如果T是一个标量类型(3.9),将对象设置为值0(零),取为 的积分常量表达式,转换为T;
  • 如果T是一个 (可能CV修饰)非工会类型,每个非静态数据 构件,并且每个基础类子对象是零初始化和填充 被初始化为零比特;
  • 如果T是(可能是cv-限定的)union 类型,则该对象的第一个非静态命名数据成员是零 - 初始化并且填充初始化为零位;
  • 如果T是 数组类型,则每个元素都是零初始化的;
  • 如果T是参考 类型,则不执行初始化。
+0

优秀和详细。正是我在找的 - 谢谢! –

2

Initialisations覆盖在[dcl.init](又名8.5)

点10表示:

其初始化为空集括号的一个目的,即,(),应进行价值初始化。

价值初始化是,简单地说,缺省建筑类和零初始化非类类型。

6

在下面的例子中,将PTR被初始化为0,切换到错误的,酒吧默认构造的?

是的。如果成员初始化程序在空括号内出现在初始化程序列表中,则该成员的初始值为。这意味着数字类型将被初始化为零,指向null的指针以及具有使用该构造函数的默认构造函数的类。

如果您根本没有将成员包含在初始化列表中,那么它将代替默认初始化;在这种情况下。数字和指针类型将保持未初始化状态。

我还可以指出C++标准中声明初始化程序列表项没有被赋予参数情况下的行为部分吗?

C++ 11 12.6.2/7指定规则与直接初始化相同。

C++ 11 8.5/16指定如果初始化程序是(),则该对象将进行值初始化。

C++ 11 8.5/7定义了值的初始化。

相关问题