什么'值初始化'是什么意思?

时间:2012-01-14 07:16:47

标签: c++ default-value value-initialization

  

可能重复:
  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 ++语言中的不同含义,但我想知道默认值和值初始化之间的语义差异,例如:值初始化是否意味着将某些内容初始化为零?

1 个答案:

答案 0 :(得分:28)

声明的变量可以是零初始化值初始化默认初始化

在你的例子中:

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

C ++ 03 Standard 8.5 / 5恰当地定义了每个:

零初始化 T类型的对象意味着:

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

默认初始化,T类型的对象意味着:
- 如果T是非POD类类型(第9节),则调用T的默认构造函数(和   如果T没有可访问的默认构造函数,则初始化是错误的;) - 如果T是数组类型,则每个元素都是默认初始化的;
- 否则,对象被零初始化。

值初始化 T类型的对象意味着:
- 如果T是具有用户声明的构造函数(12.1)的类类型(第9节),则为默认值   调用T的构造函数(如果T无法访问,则初始化是错误的   默认构造函数);
- 如果T是非联合类类型而没有用户声明的构造函数,那么每个非静态   T的数据成员和基类组件是值初始化的;
- 如果T是数组类型,则每个元素都是值初始化的;
- 否则,对象是零初始化