3

かっこなしで関数を呼び出すことはできませんが、次のソース コードがあるとします。

#include<iostream>
using namespace std;

ostream& test(ostream& os){
os.setf(ios_base::floatfield);
return os;
}

int main(){
cout<<endl<<scientific<<111.123456789;
cout<<endl<<test<<111.123456789;
}

   /// Output:
   /// 1.11235e+002
   /// 111.123

左シフト演算子のオーバーロードはありませんが、test(ostream& os)関数内で関数coutを呼び出すmain場合、括弧は必要ありません。私の質問はなぜですか?

4

2 に答える 2

6

左シフト演算子のオーバーロードはありません

はい、あります。 で定義されてい<ostream>ます。

それは、機能することを可能にするのとまったく同じ手法を使用しendlますscientific。関数ポインターを受け取るオーバーロードがあり、ストリームに書き込まれるときに関数ポインターを呼び出します。

basic_ostream関数ポインターを受け入れるこれらのメンバー関数があります。

// 27.7.3.6 Formatted output:
basic_ostream<charT,traits>&
operator<<(basic_ostream<charT,traits>& (*pf)(basic_ostream<charT,traits>&))
{ return pf(*this); }

basic_ostream<charT,traits>&
operator<<(basic_ios<charT,traits>& (*pf)(basic_ios<charT,traits>&))
{ return pf(*this); }

basic_ostream<charT,traits>&
operator<<(ios_base& (*pf)(ios_base&))
{ return pf(*this); }

cout << testcout.operator<<(&test)は、これらのオーバーロードの最初のものを使用します。これは と同等です。return test(*this);これにより、オーバーロードされた 内で呼び出しが行われoperator<<ます。

于 2015-08-24T08:47:32.423 に答える
6

ostreamこの場合、演算子 <<のオーバーロードがあります:

basic_ostream& operator<<(
    std::basic_ostream<CharT,Traits>& (*func)(std::basic_ostream<CharT,Traits>&) );

func(*this); を呼び出します。これらのオーバーロードは、std::endl などの出力 I/O マニピュレータを実装するために使用されます。

于 2015-08-24T08:47:36.753 に答える