调用操纵ostream的函数不需要括号。 C ++

时间:2015-08-24 08:44:38

标签: c++ function operator-keyword ostream manipulators

我知道没有括号就无法调用函数,但是,假设我有这段源代码:

#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函数时,它不需要任何括号。我的问题是为什么?

2 个答案:

答案 0 :(得分:6)

  

左移运算符

没有任何重载

是的,它已在<ostream>中定义。

它使用完全相同的技术,允许endlscientific工作。有一个带有函数指针的重载,当函数指针被写入流时会调用它。

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 << test使用第一个重载,相当于cout.operator<<(&test)return test(*this);执行,因此调用发生在重载的operator<<内。

答案 1 :(得分:6)

对于这种情况,

ostream重载operator <<

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

调用func(* this);.这些重载用于实现输出I / O.   操纵者,如std :: endl。