这不是在 operator= 方面实现复制构造函数的重复,而是一个更具体的问题。(或者我喜欢这样想。)
介绍
给定一个像这样的(假设的)类:
struct FooBar {
long id;
double valX;
double valZ;
long valN;
bool flag;
NonCopyable implementation_detail; // cannot and must not be copied
// ...
};
我们不能通过默认生成的函数来复制它,因为您既不能复制构造也不能复制 NonCopyable 对象。但是,这部分对象是我们实际上对复制不感兴趣的实现细节。
为 this 编写交换函数也没有任何意义,因为交换函数可以复制 std::swap 所做的(减去 NonCopyable)。
因此,如果我们想复制这些对象,我们只能自己实现 copy-ctor 和 copy-operator。只需分配其他成员即可轻松完成。
问题
如果我们需要实现copy ctor和operator,我们应该根据copy operator来实现copy ctor,还是应该用初始化列表“复制”代码?
也就是说,给定:
FooBar& operator=(FooBar const& rhs) {
// no self assignment check necessary
id = rhs.id;
valX = rhs.valX;
valZ = rhs.valZ;
valN = rhs.valN;
flag = rhs.flag;
// don't copy implementation_detail
return *this;
}
我们应该写a)
FooBar(FooBar const& rhs) {
*this = rhs;
}
或 b)
FooBar(FooBar const& rhs)
: id(rhs.id)
, valX(rhs.valX)
, valZ(rhs.valZ)
, valN(rhs.valN)
, flag(rhs.flag)
// don't copy implementation_detail
{ }
答案的可能方面是性能、可维护性和可读性。