指定的初始化程序

Designated initializers

本文关键字:程序 初始化      更新时间:2023-10-16

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

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

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

谢谢Jelle

给定

struct S {
int x, y, z;
}:
S s {
.y = 1; // not standard until C++20
};

有其他选择吗?

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

S s{0, 1};

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

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

S s{};
s.y = 1;

它的缺点是不能用于初始化常量成员。另一个缺点是这不是一个单独的初始化表达式。这可以通过使用一个函数来解决:

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) {}
};

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