可能重复:
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 :(得分: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是数组类型,则每个元素都是值初始化的;
- 否则,对象是零初始化