メンバーと非メンバーの演算子のオーバーロードの違いを見分ける方法は?
メンバーと非メンバーの演算子のオーバーロードの違いの 1 つは、メンバー関数として宣言/定義されたオーバーロードの場合、引数の数が 1 つ減ることです。単項演算子の場合は引数がありませんが、二項演算子の場合は引数があります。
クラス スコープ外で宣言/定義できないオーバーロードがいくつかあります。operator=() はその 1 つです。
さらに、メンバー関数のスコープは異なり、静的でない限り、宣言する型のインスタンスなしで呼び出すことはできません。operator=() のようにメンバー関数でなければならない一部の演算子は、静的にすることはできません。
最初の例は非メンバーですが、クラス インスタンスにアクセスでき、それらと連携しますか?
operator+() が 2 つの引数をとる二項演算子であることは、フリー関数を示します。
type が、operator+() が両方のインスタンスで機能することを許可するパブリック インターフェイスを定義している場合。または、演算子がフレンド関数として宣言されている場合は、型のプライベートおよび保護されたメンバーへの関数アクセスを許可します。
上記の例では、2 つの Jazz インスタンスの合計が明らかに int であると想定されているため、戻り値の型は非常に「興味深い」ものです。あなたはそれを疑問視したいかもしれません。
3 番目の例も非メンバーですが、Jazz ? タイプです。
この演算子は通常、コピー代入演算子と呼ばれ、前述のように、型 T の非静的メンバー関数でなければなりません。
標準は戻り値の型を義務付けておらず、単にvoidである可能性がありますが、非 const 参照を担当者、つまり割り当てられている型 T のインスタンスに返すのが慣習です。
T& T::operator(const T& rhs)
とりわけ、ref を返す理由の 1 つは、代入の連鎖が可能であることです。
T t;
T t2;
T t3;
t = t2 = t3; // assignment chaining
もう 1 つの理由は、場合によっては、標準ライブラリが operator=() がユーザー定義型の担当者への参照を返すことを想定していることです。
C および C++ の演算子のかなり完全なリストについては、このを参照してください。