2017-06-07 6 views
5

this questionの先頭の答えによると、cout << exprcout.operator<<(expr)に相当します。cout.operator <<()の動作の理解

this questionへの応答によれば、上記の文は真実ではありません。

私自身のテストによると、cout.operator<<()は整数が与えられたときcout <<と同じです。 floatを指定すると、cout.operator<<()は整数に変換されます。 cout.operator<<("hello world")のように文字列リテラルが与えられると、メモリアドレスのように見えるものが出力されます。そして、std :: stringを保持する変数が与えられると、コンパイラエラーが発生します。

何が起こっているのか、初心者から中級者の説明はありますか?

+0

"*' cout << expr'は 'cout.operator <<(expr)' *と等価です真実。第2の質問+第1のコメントからの答えはそのことを説明しています。重複しているかどうかは分かりません。おそらくこれが役立ちます:https://stackoverflow.com/questions/ 36809463/m-36809565#36809565フリーで機能を実装する利点 – luk32

答えて

5

これはexprに依存します。

両方の質問に対する回答は、その特定のケースについて言います。毛布の保証ではありません。

実際、operator<<の一部はfreefunctionsであり、一部はmember functionsです。

お気に入りのC++リファレンスを参考にしてください。

3

cout << exprcout.operator<<(expr)の同等性は、exprに依存します。

coutが「知っている」のであれば、それはcout.operator<<(expr)(メンバー関数)と同等です。

それは「ユーザータイプ」(ここstd::stringカウント)であれば、それはなどstd::ostream& operator<<(std::ostream&, const std::string&);に似た署名で過負荷に非加盟方式である

なぜcout.operator<<("hello world")は、メモリアドレスを印刷していますか?

(それがメンバメソッドを使用することを余儀なくされるので、ポインタの値を出力ostream& operator<<(const void* value);ある()を指摘されていないもの。これとは対照的に

上記に最良メンバメソッドオーバーロード、cout << "hello world"は非メンバオーバーロードostream& operator<<(ostream&, const char*)を呼び出し、これは各文字を出力に挿入します。

関連する問題