具有初始值设定项列表的构造函数中的这种重复是否真的必要
Is this duplication in constructors with initializer lists really necessary?
>我在类中是否正确使用了初始值设定项列表?似乎有很多代码重复。如果我需要另一个变量,我必须在三个地方添加它。
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;
};
初始值设定项列表的用法是正确的,但对于这个类的意义是什么,这是非常可疑的。您可以只将所有成员设为公共,然后使用聚合或统一初始化来初始化每个成员。如果你真的需要没有显示的复杂语义,那么使用 init 列表并没有错。
如果你最终有一个类,那
1)让构造函数发送其所有数据,
2)为所有成员提供吸气剂和
3)为所有成员设置二传手,
您可能应该选择没有私有成员的结构。
然后,您可以使用"统一初始化",例如:
MyX x{"hello",5.5};
无需编写构造函数。
如果不是这种情况(您的类实际上有一个不变量),那么
是的,添加成员时,您必须在 3 个地方添加一个东西。
请注意,由于范围规则,以下工作:
class A {
int mem;
public:
A(int mem) : mem(mem) {}
};
无需下划线。
相关文章:
- 运算符重载是否真的需要返回值C++?
- 如何检查函数是否真的获得了定义为 const 的变量?
- 指针铸造是否真的打破了严格的混叠
- 如果有办法判断编译器是否真的内联C++函数
- 线程是否真的在调用 std::future::get() 后启动
- 关键部分或静音是否真的是成员变量,或者何时应成为成员变量
- 两条未签名短裤的乘法是否真的会导致不确定的行为
- 将对象的第一个字段强制转换为对象的类型是否真的安全?
- 如果我想编写一个C程序,是否在CodeBlocks中选择C或C 文件真的很重要
- 如何查找Mac上是否真的存在已安装的驱动器
- 实现线程锁时是否真的需要原子性
- 具有初始值设定项列表的构造函数中的这种重复是否真的必要
- 调用函数时,堆栈帧是否真的被推到堆栈上
- 基类构造函数是否真的在派生类构造函数之前调用
- 如果其他程序在64位窗口中使用太多,那么32位程序是否真的会内存不足
- 在C++中的函数调用内部执行强制转换时,强制转换是否真的有效
- 在测试已声明但未定义的运算符是否存在时,static_assert真的应该成功吗?
- 在按值传递的重成员的构造函数初始化列表中是否真的需要std::move ?
- 其他对象中的对象是否真的共享相同的地址
- 在向量/列表中,您是否真的将其应用于对象?(C++)