Effective C++ 第2章12項
コピーコンストラクタやコピー代入演算子ではオブジェクト全体をコピーするようにして、コピーし忘れたデータが無いようにしなくてはならない。
たとえば、途中からメンバ変数を追加した場合は、コピーコンストラクタやコピー代入演算子のほうにもそのメンバ変数をコピーする処理を追加するのを忘れないように。
また、継承したクラスの場合は継承元のコピーも忘れないように。
class Test : public Base { private: Data m_Data; public: Test(const Test& rhs); Test& operator=(const Test& rhs); }; Test::Test(const Test& rhs) : Base(rhs), // 基底クラスのコピーコンストラクタの呼び出し m_Data(rhs.m_Data) { } Test& Test::operator=(const Test& rhs) { Base::operator=(rhs); // 基底クラスのコピー代入演算子の呼び出し m_Data = rhs.m_Data; return *this; }
コピーコンストラクタとコピー代入演算子は似たような処理だからと、どちらか一方から別の方を呼び出すということはしてはならない。共通部分を取りだして別の関数とし、それをそれぞれの関数から呼び出すようにする。