我的 reckful 类中有一个重载的 << 运算符,实现如下:
ostream& operator << (ostream& os, const reckful& p)
{
os << p.PrintStuff();
return os;
}
PrintStuff() 只是 reckful 的一个成员函数,它返回一个字符串。
我理解事物的方式,如果我要写类似 cout << reckobject << endl;
的东西在 main() 中,cout << reckobject
将优先,我的重载 << (使用 cout 作为左操作数和 reckobject 作为右操作数)将返回 ostream 对象 os
, 留下表达式 os << endl;
将被评估,它将输出字符串,然后结束该行。所以,第一个 << 是我声明的,第二个是标准的 << 对吗?
但是,我的主要问题是……当我运行如下语句时,事件的顺序是什么,左右操作数是什么,<< 运算符是什么:
cout << "reckful object = " << reckobject << "!" << endl;
如果 << 的任一侧都没有 ostream 对象和 reckful 对象,为什么这会起作用?
谢谢。
最佳答案
如果您注意到标准的实现方式 <<
它返回 ostream 本身。这是关键部分
有点像
cout << "reckful object = " << reckobject << "!" << endl;
将被调用一次
cout << "reckful object = "
此函数调用将返回 ostream
将用它进行第二次调用
即
cout << reckobject;
等等等等。
您可以通过执行 <<
来测试作为
void operator << (ostream& os, const reckful& p)
{
os << 1;
}
在这种情况下你可以做
std::cout << p;
但不是
std::cout << p << std::endl;
运算符使其更难理解,但请考虑一下 Point
类
struct Point
{
Point& setX( int x) { X = x; return *this;}
Point& setY( int y) { Y = y; return *this;}
int X;
int Y;
};
方式setX
和 setY
被定义,允许
Point p;
p.setX( 2 ).setY( 4 );
这是相同的机制<<
用于链接函数调用。
关于c++ - 哪个 << 是我在这条语句中的重载运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8883548/