“value initializing”是什么意思?

27

可能是重复问题:
在C++中,以下短语是什么意思:零初始化(zero-)、默认初始化(default-)和值初始化(value-initialization)?

如果我有一个类,例如:

class Info
{
   int x;
   int y;
};

我用它创建了一个对象

Info *p = new Info();

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

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


1个回答

40

一个已声明的变量可以进行零初始化值初始化默认初始化

在您的示例中:

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

C++03标准8.5/5恰当地定义了以下内容:
对于类型T的零初始化意味着:
- 如果T是标量类型(3.9),则将对象设置为转换为T的值0(零); - 如果T是非联合类类型,则每个非静态数据成员和每个基类子对象都被零初始化; - 如果T是联合类型,则对象的第一个命名数据成员被零初始化; - 如果T是数组类型,则每个元素都被零初始化; - 如果T是引用类型,则不执行初始化。
对于类型T的默认初始化意味着:
- 如果T是非POD类类型(clause 9),则调用T的默认构造函数(如果T没有可访问的默认构造函数,则初始化无效); - 如果T是数组类型,则每个元素都被默认初始化; - 否则,对象被零初始化。
对于类型T的值初始化意味着:
- 如果T是具有用户声明构造函数(12.1)的类类型(clause 9),则调用T的默认构造函数(如果T没有可访问的默认构造函数,则初始化无效); - 如果T是没有用户声明构造函数的非联合类类型,则T的每个非静态数据成员和基类组件都被值初始化; - 如果T是数组类型,则每个元素都被值初始化; - 否则,对象被零初始化。

在我的情况下,Info 类是 POD 类型。这是否意味着默认初始化将是零初始化? - user1086635
@user1086635:是的。在上面标准报价的第二段中明确提到了这一点。 - Alok Save
1
这个答案对于C++03之后的任何版本都是无效的。请参考“可能的重复”以获取更新的答案,以及cppreference - Lytigas
2
关于默认初始化的澄清:根据cppreference的说明,最后一条应该是“否则,什么也不做:具有自动存储期限的对象(及其子对象)将被初始化为不确定的值。” 这就是允许默认初始化标量具有任何值而不是零初始化的原因。 - ryan0270

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接