指定的初始化程序

时间:2018-07-24 12:58:51

标签: c++ struct

显然,指定的初始化程序不是“正确”的C ++。 有其他选择吗?

我喜欢将其用于结构,因为:

  • 创建结构对象时可以选择设置变量。
  • 初始化顺序无关紧要。
  • 变量可以是常量。
  • 这可以在c ++ 17中与基类结合使用。

谢谢 耶尔

1 个答案:

答案 0 :(得分:1)

给予

struct S {
    int x, y, z;
}:

S s {
    .y = 1; // not standard until C++20
};
  

有其他选择吗?

您可以使用位置列表初始化:

S s{0, 1};

成员名称不是显式的,这有一个缺点(可以说是有好处的,取决于情况),这取决于成员的顺序,并且最后一个显式初始化之前的所有成员也必须存在。

另一种选择:稍后分配成员。

S s{};
s.y = 1;

这具有不能用于初始化const成员的缺点。另一个缺点是这不是单个初始化表达式。可以使用以下函数解决此问题:

S init(int y) {
    S s{};
    s.y = y;
    return s;
}
S s = init(1);

另一种选择:使用构造函数。

struct S {
    int x = 0, y = 0, z = 0;
    S(int y): y(y) {}
};

在某些情况下,这可能要简单得多,但在其他情况下,则根本不清楚(例如,类似于矢量的情况)。另一个缺点是缺少琐碎的构造函数。