コピー割り当て演算子 (C++ のみ)

コピー割り当て演算子 により、 初期化をすることで、既存オブジェクトから新規オブジェクトを作成できます。 クラス A のコピー割り当て演算子は、 次の書式のいずれかを持つ非静的、非テンプレートのメンバー関数です。

クラス A に対してコピー代入演算子を宣言しない場合、コンパイラーは、コピー代入演算子を暗黙的に宣言し、それはインライン・パブリックとなります。

次の例は、暗黙的に定義された割り当て演算子と、 暗黙的なユーザー定義の割り当て演算子を示しています。
#include <iostream>
using namespace std;

struct A {
  A& operator=(const A&) {
    cout << "A::operator=(const A&)" << endl;
    return *this;
  }

  A& operator=(A&) {
    cout << "A::operator=(A&)" << endl;
    return *this;
  }

};
class B {
  A a;
};

struct C {
  C& operator=(C&) {
    cout << "C::operator=(C&)" << endl;
    return *this;
  }
  C() { }
};

int main() {
  B x, y;
  x = y;

  A w, z;
  w = z;

  C i;
  const C j();
//  i = j;
}
上記の例の出力は、次のとおりです。
A::operator=(const A&)
A::operator=(A&)

割り当て x = y は、暗黙的に定義された B のコピー割り当て演算子を呼び出します。 つまり、ユーザー定義のコピー割り当て演算子 A::operator=(const A&) を呼び出します。 割り当て w = z は、ユーザー定義の演算子 A::operator=(A&) を呼び出します。 コンパイラーは、演算子 C::operator=(const C&) が定義されていないので、 割り当て i = j を許可しません。

次のステートメントが真の場合、クラス A の暗黙的に宣言されたコピー割り当て演算子の書式は、A& A::operator=(const A&) になります。

クラス A に対して上記のことが真でない場合、 コンパイラーは、A& A::operator=(A&) の書式を使用したコピー割り当て演算子を暗黙的に宣言します。

暗黙的に宣言されたコピー割り当て演算子は、演算子の引数への左辺値参照を戻します。

派生クラスのコピー割り当て演算子は、その基底クラスのコピー割り当て演算子を隠します。

以下の 1 つ以上の条件が当てはまる場合に、コンパイラーは、クラス A のコピー代入演算子が暗黙的に定義されているか、C++11 の始まりまたは明示的にデフォルト設定されているC++11 の終わりプログラムを許可できません。

暗黙的に定義されたクラス A のコピー割り当て演算子は、 まず最初に、A の定義にそれらが現れる順序で、A の直接基底クラスを割り当てます。 次に、暗黙的に定義されるコピー割り当て演算子は、A の定義でそれらが宣言されている順序で、A の非静的データ・メンバーを割り当てます。

注: C++11 の始まり コピー割り当て演算子は、明示的にデフォルトに設定された関数または削除済み関数として宣言できます。 詳しくは、明示的にデフォルトに設定された関数 (C++11)および 削除済み関数 (C++11) を参照してください。C++11 の終わり