【问题标题】:What does 'value initializing' something mean? [duplicate]“值初始化”是什么意思? [复制]
【发布时间】:2012-02-10 06:13:06
【问题描述】:

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

【问题讨论】:

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


【解决方案1】:

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

在你的例子中:

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 类类型(第 9 条),则调用 T 的默认构造函数(并且 如果 T 没有可访问的默认构造函数,则初始化格式错误);
— 如果 T 是数组类型,则每个元素都是默认初始化的;
— 否则,对象被零初始化。

值初始化类型 T 的对象意味着:
— 如果 T 是具有用户声明的构造函数 (12.1) 的类类型(第 9 条),则默认 调用 T 的构造函数(如果 T 不可访问,则初始化格式不正确 默认构造函数);
— 如果 T 是没有用户声明的构造函数的非联合类类型,则每个非静态 T 的数据成员和基类组件是值初始化的;
— 如果 T 是数组类型,则每个元素都是值初始化的;
— 否则,对象被零初始化

【讨论】:

  • 就我而言,Info 类是 POD 类类型。这是否意味着默认初始化将是零初始化?
  • @user1086635:是的。在上面的标准报价的第二段中明确提到了这一点。
  • 此答案对于 C++03 之后的任何内容都无效。请参阅“可能重复”以获取更新的答案,以及 cppreference
  • 关于默认初始化的说明:根据cppreference,最后一个项目符号应该是“否则,什么都不做:具有自动存储持续时间的对象(及其子对象)被初始化为不确定的值。”这就是允许默认初始化标量具有任何值而不是零初始化的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-16
  • 2020-07-17
相关资源
最近更新 更多