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