演算子のオーバーロードの一般的な規則
次の規則はオーバーロードされた演算子がどのように実装されるかを抑制します。ただし個別に説明します 新規作成 と 削除 の演算子には適用されません。
新しい演算子 (など) ** 定義できません。
組み込みデータ型に適用された演算子の意味は再定義できません。
オーバーロードされた演算子は非静的クラスのメンバー関数またはグローバル関数である必要があります。プライベートへのアクセスを必要とすると保護されたクラス メンバーはクラスのフレンドとして宣言する必要があります。グローバル関数。グローバル関数はではなくクラスまたはクラス列挙体または列挙型への参照である 1 文字以上の引数を受け取る必要があります。次に例を示します。
// rules_for_operator_overloading.cpp class Point { public: Point operator<( Point & ); // Declare a member operator // overload. // Declare addition operators. friend Point operator+( Point&, int ); friend Point operator+( int, Point& ); }; int main() { }
このコードの例はメンバー関数として演算子より小さい) を宣言します ; ただし加算演算子はフレンド アクセスできるグローバル関数として宣言されています。複数の実装が特定の演算子を使用できることに注意してください。前の加算演算子の場合は commutativity を簡単にするために2 種類の実装が用意されています。これはPoint に PointPoint への int などを追加する演算子がその実行されることがあります。同様にあります。
演算子が組み込み型との一般的な使用方法によって規定オペランドの優先順位およびグループ数と一致します。そのため型のオブジェクトに Point 概念を表現する方法 「を追加します。2 と 3 を」x 座標に追加されます。2 と y 座標に追加する 3 とおりが必要になります。
メンバー関数として宣言された単項演算子は引数を受け取りません ; グローバル関数として宣言されている場合は1 個の引数を受け取ります。
メンバー関数として宣言されている二項演算子は二つの引数 (1; グローバル関数として宣言されている場合は2 個の引数を受け取ります。
演算子を単項演算子または二項演算子として *(および) +- 使用できる各使用して別のオーバーロードできます。
オーバーロードされた演算子は既定の引数を指定することはできません。
()operator= 割り当てを除くすべてのオーバーロードされた演算子は派生クラスに継承されます。
メンバー関数のオーバーロードされた演算子の最初の引数は演算子が呼び出されたオブジェクトのクラス常に型です (演算子が宣言されているクラスまたはそのクラスの派生クラス)。変換は最初の引数で指定されません。
演算子のいずれかの方法で変更できることに注意してください。これはアドレス ()()および = 関数呼び出し演算子の意味があります。また組み込み型に対して行うことができる ID で演算子のオーバーロードを使用して変更できます。たとえば次の 4 種類のステートメントは通常完全に評価されると同じです :
var = var + 1;
var += 1;
var++;
++var;
この ID は演算子をオーバーロードするクラス型に使用できません。またこれらの演算子の使用で暗黙の基本的な要件の一部をオーバーロードされた演算子に緩和されています。たとえば+= とは加算代入演算子と基本型に適用される場合左オペランドは左辺値である必要があります。; 演算子をオーバーロードするとこのような要件はありません。
[!メモ]
一貫性を保つためにオーバーロードされた演算子を定義する場合組み込み型のモデルに従うことをお勧めします。オーバーロードされた演算子であるセマンティクスが他のコンテキストの意味とは大きく異なる場合により複雑になることがあります。