2012-01-14 133 views
10

可能重复:
What do the following phrases mean in C++: zero-, default- and value-initialization?“值初始化”是什么意思?

如果我有例如一个类:

class Info 
{ 
    int x; 
    int y; 
}; 

这在我以前创建的对象,

Info *p = new Info(); 

Info旁边的括号是否表示我正在初始化它的值?它与此有何不同,Info *p = new Info;

我知道有一个question区分新旧C++语言中的不同含义,但我想知道默认值和值初始值之间的语义差异,例如值初始化意味着什么东西初始化为零?

+0

[以下短语在C++中意味着什么:零,初始值和初始值?](http://stackoverflow.com/questions/1613341 /),[C++ 03中default-initialize和value-initialize的区别?](http://stackoverflow.com/questions/7084831/)。 – outis 2012-01-14 07:21:32

回答

19

声明的变量可以是零初始化值进行初始化默认情况下初始化

在您的例子:

Info *p = new Info(); <------- Value Initialization 
Info *p = new Info;  <------- Default Initialization 

的C++ 03标准8.5/5恰当地定义了每个:

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

- 如果T是标量类型(3.9),则将该对象设置为转换为T的值0(零);
- 如果T是非联合类类型,则将每个非静态数据成员和每个基类子对象0初始化;
- 如果T是联合类型,则该对象的第一个命名数据成员是零初始化的;
- 如果T是一个数组类型,每个元素都是零初始化的;
- 如果T是参考类型,则不执行初始化。

缺省初始化类型T的对象是指:
- 如果T是一个非POD类型(第9节),T的默认构造函数被调用(并形成不良的 初始化如果T没有可访问的默认构造函数);
- 如果T是一个数组类型,则每个元素都默认初始化;
- 否则,该对象是零初始化的。

值初始化类型T的对象是指:
- 如果T是一个类型(第9节)与用户声明的构造(12。1),那么调用T的默认构造函数 (并且如果T没有可访问的默认构造函数,则初始化不合格);
- 如果T是一个没有用户声明构造函数的非联合类类型,那么T的每个非静态数据成员和基类组件都进行了值初始化;
- 如果T是一个数组类型,那么每个元素都进行了值初始化;
- 否则,该对象是零初始化的

+0

Als - 非常好的答案 - 保存我打字! – 2012-01-14 07:33:53

+0

在我的例子中,class Info是POD类的类型。这是否意味着默认初始化将是零初始化? – user1086635 2012-01-14 07:38:48

+0

@ user1086635:是的。在上面的标准报价的第二段中明确提到了这一点。 – 2012-01-14 07:42:55