代入演算子の定石

代入演算子を実装しなければならない場合は、以下のようにする。

class some_class
{
public:

    some_class& operator = (const some_class& another)
    {
        some_class tmp_(another);
        swap(tmp_);

        return *this;
    }

    void swap(some_class& another)
        throw ();

};

ポイントは:

  • 一時オブジェクト tmp_ を作り、thistmp_ の中身を入れ替える (swap)。
  • swap は例外を決して送出しない。
  • 「コピー」の具体的な操作は、コピーコンストラクタに任せる。

細かな注意点としては、

  • 最後は必ず return *this; にする。
  • 返却値には const を付けない。

tmp_ を作るのは、メンバ変数ごとの代入を続けている途中で例外が投げられた場合に代入先が中途半端に変わった状態になってしまうのを防ぐため (例外安全性・原子性保証)。おまけとして、自己代入の場合も自動的にケアされる。