1

この質問への答えは私にはわからないようですが、非メンバー関数でオーバーロードするにはどうすればよいでしょうか。プログラム レベルの関数を作成しただけで、プロトタイプ (または定義) が存在する場合、演算子はそのクラス型に対してオーバーロードされていますか?

4

1 に答える 1

3

メンバー関数でthisは、左側のパラメーターになります。つまり、演算子には引数が 1 つしかありません (単項演算子の場合は何もありません)。独立関数では、二項演算子または単項演算子にそれぞれ 2 つまたは 1 つの引数を指定する必要があります。

良い例は<< ストリームの演算子です:

class T;

// ...

std::ostream & operator<<(std::ostream &os, const T &val)
{
    // ...
    return os;
}

ここで、osは左側のパラメータで、valは右側のパラメータです。

「where」については、演算子を使用する場所を定義する必要があります。通常、演算子をオーバーロードする型と同じ場所に配置します。

編集:

自明でない演算子 (プリミティブ型の算術演算) の場合、演算子は関数呼び出しの構文糖衣です。これを行う場合:

std::cout << "Hello";

それは次のように書いているようなものです:

operator<<(std::cout, "Hello");

でももっと読みやすい。

メンバ オペレータの場合、左のパラメータは になりますthis(メンバ オペレータの引数が 1 つ少ないのはそのためです)。

于 2011-04-23T05:40:55.037 に答える