c++ - 哪个 << 是我在这条语句中的重载运算符?

标签 c++

我的 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;
};

方式setXsetY被定义,允许

    Point p;
    p.setX( 2 ).setY( 4 );

这是相同的机制<<用于链接函数调用。

关于c++ - 哪个 << 是我在这条语句中的重载运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8883548/

相关文章:

c++ - 将 C++ argv[] 解释为变量与 CERN 的 ROOT 之间的关系

c++ - 遍历列表

c++ - 如何在 CEdit 控件中保留插入符位置?

c++ - 哪种持续集成工具最适合 C++ 项目?

c++ - (C++) 使类静态 : put the constructor as private or delete it publically? 时什么更好

c++ - 为什么 boost::adaptors::filtered 的输出没有名为 size 的成员?

c++ - opencv的Qt dll错误

c++ - libmysqlclient.a 和 libmysqlclient_r.a 有什么区别?

c++ - 为什么 C++ 函数模板实例化的返回类型包含在损坏的函数名称中?

c++ - (匿名)命名空间、函数和头文件