コピー代入演算子 により、
初期化をすることで、既存オブジェクトから新規オブジェクトを作成できます。
クラス 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 の非静的データ・メンバーを割り当てます。
関連参照