Effective C++ 第2章11項
自分自身を代入しようとする自己代入のコードが書かれても大丈夫なようにoperator=を実装すべき。
簡単な方法としては同じかチェックするというもの。
Test& Test::operator=(const Test& rhs) { if(this == &rhs) return *this; // 以下、コピーするコード }
あとクラスがメンバにあるオブジェクトへのポインタを持っているような場合。
class Test { private: Data *m_pData; }; Test& Test::operator=(const Test& rhs) { Data *p = m_pData; // 元のデータのポインタを保存 m_pData = new Data(*rhs.m_pData); // 新たなコピーを作成 delete p; // 元のデータのオブジェクトを破棄 return *this; }
元のデータのオブジェクトを破棄してから、新たなコピーを作成するのではなく、新たなコピーを作成してから元のデータを破棄する順番が重要。