コピー代入演算子

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 を許可しません。

次のことが true の場合、暗黙的に宣言されたクラス A のコピー代入演算子は、 A& A::operator=(const A&) の書式を持ちます。

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

暗黙的に宣言されたコピー代入演算子は、演算子の引き数への参照を戻します。

派生クラスのコピー代入演算子は、その基底クラスのコピー代入演算子を隠します。

コンパイラーは、クラス A に対してコピー代入演算子を暗黙的に定義しなければならず、 次のなかで 1 つまたは複数が true になっているようなプログラムは、許可しません。

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

関連参照

IBM Copyright 2003