没有构造函数的C ++零初始化

Jojolatino

我不了解关于为其成员具有默认值的结构零初始化的情况。

如果我有这些结构:

struct A {
  int *a;
  int b;
};

struct B {
  int *a;
  int b;
  B() : b(3) {}
};

struct C {
  int *a;
  int b = 3;
};

我们可以毫无疑问地说:

  • A a; 保留所有字段未初始化
  • A a{}; 是{nullptr,0}
  • B b;B b{};两者都是{垃圾,3}(该构造函数被调用)

现在不清楚执行以下操作会发生什么,这是使用gcc的结果:

C c; // {garbage, 3}
C c{}; // {nullptr, 3}

问题是:如果我像这样显式构造对象是否C c{}; 保证C::a初始化为nullptr,换句话说,是否具有默认成员(如C零)会初始化其他成员C c{};

因为如果我的构造函数执行的操作与C(如中的B相同,这不会发生,所以其他成员没有初始化为零,但是为什么呢?B之间有什么区别C

伊戈尔·坦德尼克(Igor Tandetnik)

从C ++ 14开始,C是聚合(如A),C c{}语法执行聚合初始化。其中部分包括:

[dcl.init.aggr] / 8如果列表中的初始化程序子句少于非联盟聚合中的元素,则按以下方式初始化每个未显式初始化的元素:
(8.1)—如果该元素具有一个默认成员初始化程序(12.2),则从该初始化程序初始化该元素。
(8.2)—否则,如果该元素不是引用,则从一个空的初始化程序列表(11.6.4)复制该元素。
(8.3)—否则,程序格式错误。

所以C c{};等于C c{{}, 3};int*用空列表初始化成员会使其初始化为零。

在C ++ 11中,C它不是一个聚合(具有默认的成员初始化程序是不合格的),并且会C c{};调用一个隐式定义的构造函数,使c.a成员保持未初始化状态。

在标准的所有版本中,B由于用户定义的构造函数它都不是合计的。B b{};调用该构造函数,该构造函数显式初始化b成员并选择保留a未初始化状态。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C ++零初始化

来自分类Dev

零初始化忽略构造函数

来自分类Dev

C ++没有匹配的构造函数的[]初始化

来自分类Dev

零初始化,静态初始化和值初始化有何不同?

来自分类Dev

类POD成员是默认初始化还是零初始化还是没有初始化?

来自分类Javascript

初始化状态,没有构造函数在反应

来自分类Dev

在没有构造函数的类中初始化变量

来自分类Dev

构造函数没有初始化正确的值

来自分类Dev

c++ 中的初始化没有匹配的构造函数错误。我的构造函数有什么问题?

来自分类Dev

C ++零初始化-为什么此程序中的`b`未初始化,而`a`已初始化?

来自分类Dev

在构造函数之后用零初始化向量的有效方法

来自分类Dev

在没有构造函数的情况下初始化const c ++类

来自分类Dev

C ++类:在没有构造函数重载的情况下初始化属性

来自分类Dev

C ++错误:没有匹配的构造函数用于初始化

来自分类Dev

C ++的类变量可以在没有Java构造函数的情况下初始化吗?

来自分类Dev

vscode中的C ++:错误:没有匹配的构造函数来初始化'std :: thread'

来自分类Dev

使用 Root/C++ 时出错:“TTree”的初始化没有匹配的构造函数

来自分类Dev

在C ++中没有匹配的构造函数来初始化可变参数模板

来自分类Dev

没有默认构造函数的成员对象的 C++ 初始化:

来自分类Dev

错误C2512:没有合适的默认构造函数-为什么在构造函数中初始化属性?

来自分类Dev

C++中关于常量初始化和零初始化的顺序的矛盾定义

来自分类Dev

C ++默认初始化是否保留先前的零初始化?

来自分类Dev

为什么C ++会用零初始化std :: vector而不初始化std :: array?

来自分类Dev

Visual C ++似乎是对不应初始化的类的POD成员进行零初始化

来自分类Dev

是否有保证int成员被零初始化的情况?

来自分类Dev

c ++ c样式零初始化{0}

来自分类Dev

C ++ 20位之前的字段零初始化

来自分类Dev

C-2d数组未用零初始化

来自分类Dev

零重新初始化C ++中的结构

Related 相关文章

  1. 1

    C ++零初始化

  2. 2

    零初始化忽略构造函数

  3. 3

    C ++没有匹配的构造函数的[]初始化

  4. 4

    零初始化,静态初始化和值初始化有何不同?

  5. 5

    类POD成员是默认初始化还是零初始化还是没有初始化?

  6. 6

    初始化状态,没有构造函数在反应

  7. 7

    在没有构造函数的类中初始化变量

  8. 8

    构造函数没有初始化正确的值

  9. 9

    c++ 中的初始化没有匹配的构造函数错误。我的构造函数有什么问题?

  10. 10

    C ++零初始化-为什么此程序中的`b`未初始化,而`a`已初始化?

  11. 11

    在构造函数之后用零初始化向量的有效方法

  12. 12

    在没有构造函数的情况下初始化const c ++类

  13. 13

    C ++类:在没有构造函数重载的情况下初始化属性

  14. 14

    C ++错误:没有匹配的构造函数用于初始化

  15. 15

    C ++的类变量可以在没有Java构造函数的情况下初始化吗?

  16. 16

    vscode中的C ++:错误:没有匹配的构造函数来初始化'std :: thread'

  17. 17

    使用 Root/C++ 时出错:“TTree”的初始化没有匹配的构造函数

  18. 18

    在C ++中没有匹配的构造函数来初始化可变参数模板

  19. 19

    没有默认构造函数的成员对象的 C++ 初始化:

  20. 20

    错误C2512:没有合适的默认构造函数-为什么在构造函数中初始化属性?

  21. 21

    C++中关于常量初始化和零初始化的顺序的矛盾定义

  22. 22

    C ++默认初始化是否保留先前的零初始化?

  23. 23

    为什么C ++会用零初始化std :: vector而不初始化std :: array?

  24. 24

    Visual C ++似乎是对不应初始化的类的POD成员进行零初始化

  25. 25

    是否有保证int成员被零初始化的情况?

  26. 26

    c ++ c样式零初始化{0}

  27. 27

    C ++ 20位之前的字段零初始化

  28. 28

    C-2d数组未用零初始化

  29. 29

    零重新初始化C ++中的结构

热门标签

归档