2011-11-20 173 views
5

从这个answer,在C++ 03中,POD类型默认初始化,如果()被省略,否则它被初始化值。默认初始化与数值初始化

// POD type 
struct foo { 
    int x; 
}; 

// value-initialized 
new foo(); 

但是,如果提供了用户定义的构造函数,那么下面的任何对象都将被视为默认值或初始值?

// non-POD type 
struct bar { 
    bar(int x = 0):x(x) {} 
    int x; 
}; 

new bar(); 
new bar(42); 
+1

在你的榜样,无论是调用'bar'的构造导致x'的'初始化期间提供的值。 – Chad

回答

2

如果你的类有一个用户定义的默认构造函数,则默认和值初始化的原因是构造函数被调用。无论发生什么事情接下来就是长达构造:

struct UDT 
{ 
    int a; 
    int b; 
    Foo c; 
    Foo d; 
    UDT() : a(), c() {} 
}; 

UDT类的一个对象的默认和值初始化将导致UDT::aUDT::c是值初始化(所以a为零),因为初始化列表是这么说的,而UDT::bUDT::d本身是默认初始化的(因此b未初始化,并且d递归应用相同的逻辑)。

有关初始化的详细信息,请参阅8.5,初始化程序列表请参见12.6.2(尤其是第8章)。

3

在C++ 03中,如果()被省略,则POD类型将被默认初始化,否则将被初始化。

这并不完全是这样。根据C++ 03规范第8.5节/ 9节的规定,如果没有为非静态POD类型对象指定初始化程序,那么它及其子对象“具有不确定的初始值”。那是不是与默认初始化相同。默认初始化与POD类型的值初始化是相同的,这意味着对象是零初始化的(8.5/5),但这只能在空初始​​化器(即空括号每8.5/7)。因此,您只能使用空初始化程序对POD类型进行缺省值和/或值初始化。当没有指定初始化程序时,不会发生非静态POD类型的默认初始化。

在你的第二个例子中,使用具有用户定义的构造函数,默认初始化在技术上采取的地方,如果你省略了值初始化(括号)符号的非POD类型。换句话说:

bar* ptr_a = new bar; //default initialization 
bar* ptr_b = new bar(); //value initialization 

记住尽管这与两个非POD结构或类类型,如果存在一个用户定义的构造函数,缺省初始化和值初始化,每8.5/5,这两个呼叫用户定义的构造函数。所以,最后,用类型bar因为你已经宣布它,默认值和初始化最终做同样的事情。