これは、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を自分で実装する必要があります。これは、他のメンバーを割り当てるだけで簡単に実行できます。
質問
copy ctorとoperatorを実装する必要がある場合、copy演算子の観点から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
{ }
答えの考えられる側面は、パフォーマンス対保守性対可読性です。