2012-03-28 5 views
5

マニピュレータの作成に次のコードを使用することができます。マニピュレータの演算子オーバーロード

#include<iostream> 
ostream & symbol(ostream & output) 
{ 
    return output << "\tRs"; 
} 

それが正常に働いています。次の文

cout << "Total amount: " << 567 << symbol; 

は出力

Total amount: 567 Rs 

を与えます。しかし、それが働いている理由を私は理解していませんでした。 C++で演算子のオーバーロードに関する以下の情報があります。

  1. 既存の演算子のみがオーバーロードされます。新しい演算子は作成できません。 シンボルは、既存の演算子ではありません。ステートメントで

  2. COUT < < "総額" < <シンボル;)は、< <が過負荷演算子であり、シンボルが可変/オブジェクトであると思われます。 しかし、シンボルを変数/オブジェクトとして宣言しませんでした。

  3. なぜ彼らはreturnステートメントを使用している(リターン出力< < "\ TRS";)?。または(出力< < "\ TRS";)動作するはずです(私が試したが、動作していない:))

実は、私は知りませんが、私は(リターン "\ TRSは")だと思います。どのように上記のコードが動作している。上の演算子のオーバーロードの作業を説明する誰かがいますか?

答えて

7

あなたはオペレータ<<機能symbolを渡しています。 <<は、現在のostream(ostreamオブジェクトをパラメータとして)でその関数を呼び出し、結果を表示します。 (と呼ばれる<<の正確なバージョンがある:ostream::operator<< (ostream& (*pf)(ostream&)); - 詳細はreferenceを参照)

戻り値の型は、複数の<<年代の連鎖を可能にし、ostreamです。 <<はストリームにアクセスできるため、特殊なケースでは技術的には必要ありませんが、これは演算子との整合性を保つためです(私は思っています)。あなたは選択肢がないので、もちろん<<は、この戻りパラメータが必要です:)

+0

あらかじめ定義されたオーバーロード 'operator <<(ostream&、ostream&(*)(ostream&))'が存在するのでしょうか? – Vlad

+1

'operator <<(ostream&(* pf)(ostream &));'は[std :: ostream](http://www.cplusplus.com/reference/iostream/ostream/operator%3C%3C/)のメンバーです。 – Attila

1

basic_ostream

basic_ostream& operator<<(basic_ostream& (*pf)(basic_ostream&)); 

のメンバーである既存のoperator<<過負荷があり、署名は(など、だけでなく、std::endlstd::flush)あなたの関数に一致します。

関連する問題