具有初始化列表的构造函数中的这种重复是否真的有必要?
Is this duplication in constructors with initializer lists really necessary?
我在 class 中是否正确使用了初始化列表?似乎有很多代码重复。如果我需要另一个变量,我必须在三个地方添加它。
class MyClass {
public:
MyClass(
anotherClass _a,
std::string _b,
std::string _c,
float _d
)
: a(_a),
b(_b),
c(_c),
d(_d)
{ }
private:
anotherClass a;
std::string b;
std::string c;
float d;
};
初始化列表的使用是正确的,但是这个 class 的意义是非常可疑的。您可以让所有成员 public 然后使用聚合或统一初始化来初始化每个成员。如果您确实需要未显示的复杂语义,那么使用 init 列表没有任何问题。
如果你最终得到 class,那
1)有一个构造函数发送它的所有数据,
2) 为所有成员提供吸气剂并且
3) 为所有成员设置二传手,
您可能应该选择没有私有成员的结构。
然后你可以使用 'uniform initialization' 比如:
MyX x{"hello",5.5};
无需编写构造函数。
如果不是这种情况(你的 class 实际上有一个不变量)那么
是的,添加成员时必须在3个地方添加一个东西。
请注意,由于范围规则,以下工作:
class A {
int mem;
public:
A(int mem) : mem(mem) {}
};
不需要下划线。
我在 class 中是否正确使用了初始化列表?似乎有很多代码重复。如果我需要另一个变量,我必须在三个地方添加它。
class MyClass {
public:
MyClass(
anotherClass _a,
std::string _b,
std::string _c,
float _d
)
: a(_a),
b(_b),
c(_c),
d(_d)
{ }
private:
anotherClass a;
std::string b;
std::string c;
float d;
};
初始化列表的使用是正确的,但是这个 class 的意义是非常可疑的。您可以让所有成员 public 然后使用聚合或统一初始化来初始化每个成员。如果您确实需要未显示的复杂语义,那么使用 init 列表没有任何问题。
如果你最终得到 class,那
1)有一个构造函数发送它的所有数据,
2) 为所有成员提供吸气剂并且
3) 为所有成员设置二传手,
您可能应该选择没有私有成员的结构。
然后你可以使用 'uniform initialization' 比如:
MyX x{"hello",5.5};
无需编写构造函数。
如果不是这种情况(你的 class 实际上有一个不变量)那么
是的,添加成员时必须在3个地方添加一个东西。
请注意,由于范围规则,以下工作:
class A {
int mem;
public:
A(int mem) : mem(mem) {}
};
不需要下划线。