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

use*_*635 18 c++ default-value value-initialization

可能重复:
C++中的以下短语是什么意思:零,默认和值初始化?

如果我有一个班级,例如:

class Info
{
   int x;
   int y;
};
Run Code Online (Sandbox Code Playgroud)

我曾经创建过一个对象,

Info *p = new Info();
Run Code Online (Sandbox Code Playgroud)

Info旁边的括号是否意味着我正在初始化它?它与此Info *p = new Info;有何不同?

我知道有一个问题可以区分新旧C++语言中的不同含义,但我想知道默认值和值初始化之间的语义差异,例如,值初始化是否意味着将某些内容初始化为零?

Alo*_*ave 30

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

在你的例子中:

Info *p = new Info();    <------- Value Initialization
Info *p = new Info;      <------- Default Initialization
Run Code Online (Sandbox Code Playgroud)

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是一个类型(第9节)与用户声明的构造(12.1),然后对T中的默认构造函数被调用(以及初始化是形成不良的如果T没有可访问的默认构造函数);
- 如果T是没有用户声明的构造函数的非联合类类型,则T的每个非静态数据成员和基类组件都是值初始化的;
- 如果T是数组类型,则每个元素都是值初始化的;
- 否则,对象被零初始化

  • 关于默认初始化的澄清:根据 [cppreference](https://en.cppreference.com/w/cpp/language/default_initialization),最后一个项目符号应该是“否则,什么也不做:具有自动存储持续时间的对象(及其子对象)被初始化为不确定的值。” 这就是允许默认初始化标量具有任何值而不是零初始化的原因。 (2认同)