调用操作 ostream 的函数不需要括号。 C++
Calling a function which manipulates the ostream doesn't require parentheses. C++
我知道没有括号就不能调用函数,但是,假设我有这段源代码:
#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
左移运算符没有任何重载,但是当我在 main
函数中调用 cout
中的 test(ostream& os)
函数时,它不需要任何括弧。我的问题是为什么?
There isn't any overloading for the left-shift operator
是的,它在 <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 << test
使用第一个重载,相当于 cout.operator<<(&test)
,return test(*this);
所以调用发生在重载的 operator<<
.[=20 中=]
ostream
在这种情况下有 operator << 的重载:
basic_ostream& operator<<(
std::basic_ostream<CharT,Traits>& (*func)(std::basic_ostream<CharT,Traits>&) );
Calls func(*this);. These overloads are used to implement output I/O
manipulators such as std::endl.
我知道没有括号就不能调用函数,但是,假设我有这段源代码:
#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
左移运算符没有任何重载,但是当我在 main
函数中调用 cout
中的 test(ostream& os)
函数时,它不需要任何括弧。我的问题是为什么?
There isn't any overloading for the left-shift operator
是的,它在 <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 << test
使用第一个重载,相当于 cout.operator<<(&test)
,return test(*this);
所以调用发生在重载的 operator<<
.[=20 中=]
ostream
在这种情况下有 operator << 的重载:
basic_ostream& operator<<(
std::basic_ostream<CharT,Traits>& (*func)(std::basic_ostream<CharT,Traits>&) );
Calls func(*this);. These overloads are used to implement output I/O manipulators such as std::endl.