Это не дубликат Реализация конструктора копирования в терминах operator = , но это более конкретный вопрос. (Или так мне нравится думать.)
Введение
Учитывая (гипотетический) класс, подобный этому:
struct FooBar {
long id;
double valX;
double valZ;
long valN;
bool flag;
NonCopyable implementation_detail; // cannot and must not be copied
// ...
};
мы не можем скопировать это сгенерированными по умолчанию функциями, потому что вы не можете ни копировать конструкцию, ни копировать объект NonCopyable. Однако эта часть объекта является деталью реализации, которую мы на самом деле не заинтересованы в копировании.
Также не имеет никакого смысла писать функцию подкачки для этого , потому что функция подкачки может просто копировать то, что делает std :: swap (за исключением NonCopyable).
Так что, если мы хотим скопировать эти объекты, нам остается реализовать copy-ctor и copy-operator самостоятельно. Это тривиально, просто назначив других членов.
Вопрос
Если нам нужно реализовать ctor и оператор копирования, должны ли мы реализовать 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;
}
Должны ли мы написать а)
FooBar(FooBar const& rhs) {
*this = rhs;
}
или б)
FooBar(FooBar const& rhs)
: id(rhs.id)
, valX(rhs.valX)
, valZ(rhs.valZ)
, valN(rhs.valN)
, flag(rhs.flag)
// don't copy implementation_detail
{ }
Возможными аспектами ответа могут быть производительность, удобство обслуживания и удобочитаемость.