【问题标题】:Value initialization on explicit constructor call in C++? [duplicate]C++中显式构造函数调用的值初始化? [复制]
【发布时间】:2012-08-16 23:53:53
【问题描述】:

可能重复:
What do the following phrases mean in C++: zero-, default- and value-initialization?

人们在很多地方都说过,对类构造函数的显式调用会导致值初始化[当不存在使用定义的构造函数时],并且默认构造函数不会这样做[这是一个无操作的构造函数] 但完全不同。

如果没有调用构造函数,实际会发生什么或者在这种情况下什么是值初始化?

【问题讨论】:

  • 总是有记录这种行为的标准,但我想这不是你的意思,或者是吗?
  • 是否有支持/提及/解释这种行为的文档? 是的,它被称为标准
  • 这很快o.O感谢@Als指出这一点。搜索时没找到。
  • 我错过了什么吗?根据您的回答,例如。类 A { int i; }; A x = A(); -> 值初始化,所以 i=0。美好的。 A x -> 默认初始化,这是 POD 类类型,因此它也应该是零初始化??

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


【解决方案1】:

这仅适用于聚合:考虑一下:

struct Holder
{
   Aggregate a;
   NonAggr   n;

   Holder(int, char) : a(), n() { }
   Holder(char, int) { }
};

Holder h1(1, 'a');
Holder h2('b', 2);

假设Aggregate 是一个聚合类型。现在h1.a 是值初始化的,它对每个成员进行值初始化,而h2.a 是默认初始化的,它对每个成员进行默认初始化。 n 成员也是如此,但如果 NonAggr 是非聚合类类型,则将始终调用其默认构造函数。

【讨论】:

    【解决方案2】:

    首先,如果没有调用构造函数,实际会发生什么

    类类型的构造函数总是在构造对象时调用,无论是用户定义的还是编译器生成的。对象已初始化,但成员可以保持未初始化状态。这使得问题的第二部分过时了。

    其次,是否有支持/提及/解释这种行为的文档?

    万能的标准。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多