これは、標準の 12.8/17 で定義されています。
ユーザー宣言のコピー代入演算子は、 、、、または型のパラメーターを 1 つだけ持つX::operator=
class の非静的非テンプレート メンバー関数です。X
X
X&
const X&
volatile X&
const volatile X&
たとえば、次のようになります。
struct X {
int a;
// an assignment operator which is not a copy assignment operator
X &operator=(int rhs) { a = rhs; return *this; }
// a copy assignment operator
X &operator=(const X &rhs) { a = rhs.a; return *this; }
// another copy assignment operator
volatile X &operator=(const volatile X &rhs) volatile {
a = rhs.a;
return *this;
}
};
代入演算子は、オブジェクトに代入するときに使用されます。それはあまり意味がないと思うかもしれませんが、サンプル コードはオブジェクトに代入Class_name instance_name1 = instance_name2;
せず、オブジェクトを初期化します。違いは言語の文法にあります。どちらの場合も、=
シンボルはinitializer-clauseと呼ばれるものの前にありますがClass_name instance_name1 = instance_name2;
、定義ですが、が定義されinstance_name1 = instance_name2;
た後instance_name1
は、代入式を含む式ステートメントです。代入式は代入演算子を使用し、定義はコンストラクターを使用します。
オーバーロード解決の通常のルールで、コピー代入演算子である代入演算子が選択される場合は、コピー代入演算子が使用されます。
X x;
x = 4; // uses non-copy assignment operator
X y;
y = x; // uses copy assignment operator
コピー代入演算子と非コピー代入演算子が区別される理由は、コピー代入演算子を宣言すると、デフォルトのコピー代入演算子が抑制されるためです。非コピー代入演算子を宣言すると、デフォルトのコピー代入は抑制されません。