割り当て

代入演算子 (=) は、厳密には二項演算子です。 この宣言は他の二項演算子と同じですが、次の例外があります。

  • 非静的メンバー関数である必要があります。 非メンバー関数として宣言できる operator= はありません。
  • 派生クラスにより継承されません。
  • 既定の operator= 関数は、存在しない場合、コンパイラによってクラス型に対して生成することができます。

次の例では、代入演算子を宣言する方法を示しています。

class Point
{
public:
    int _x, _y;

    // Right side of copy assignment is the argument.
    Point& operator=(const Point&);
};

// Define copy assignment operator.
Point& Point::operator=(const Point& otherPoint)
{
    _x = otherPoint._x;
    _y = otherPoint._y;

    // Assignment operator returns left side of assignment.
    return *this;
}

int main()
{
    Point pt1, pt2;
    pt1 = pt2;
}

指定された引数は式の右辺です。 演算子は、代入の完了後に左側の値を返す代入演算子の動作を保持するオブジェクトを返します。 これにより、次のように割り当てを連鎖させることができます。

pt1 = pt2 = pt3;

コピー代入演算子は、コピー コンストラクターと混同しないようにしてください。 後者は、既存のオブジェクトから新しいオブジェクトを構築するときに呼び出されます。

// Copy constructor is called--not overloaded copy assignment operator!
Point pt3 = pt1;

// The previous initialization is similar to the following:
Point pt4(pt1); // Copy constructor call.

Note

コピー代入演算子を定義するクラスでは、コピー コンストラクター、デストラクター、および C++ 11 以降では移動コンストラクターと移動代入演算子も明示的に定義する必要があるという 3 つの規則に従うことをお勧めします。

関連項目