0

これらの C++ の例では:

 1. int operator+ ( Jazz &lhs,Jazz &rhs );

 2. Jazz & Jazz operator= (const Jazz &);

 3. Jazz & operator+ ( const Jazz & )

C++ での演算子のオーバーロードの背後にある基本的な概念を理解しています。私が知らないのは:

2 番目の例では、 operator=をオーバーロードする前に、コピー コンストラクター関数を宣言して定義する必要がありますか?

メンバーと非メンバーの演算子のオーバーロードの違いを見分ける方法は?

最初の例は非メンバーですが、クラス インスタンスにアクセスでき、それらと連携しますか?

3 番目の例も非メンバーですが、Jazz ? タイプです。

誰か説明してください。ありがとうございました。

4

2 に答える 2

0

メンバーと非メンバーの演算子のオーバーロードの違いを見分ける方法は?

メンバーと非メンバーの演算子のオーバーロードの違いの 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++ の演算子のかなり完全なリストについては、このを参照してください。

于 2013-08-31T10:57:18.543 に答える