在cpp中重载<<运算符的正确方法是啥[重复]

Posted

技术标签:

【中文标题】在cpp中重载<<运算符的正确方法是啥[重复]【英文标题】:What is the the correct way in Overloading the << Operator in cpp [duplicate]在cpp中重载<<运算符的正确方法是什么[重复] 【发布时间】:2021-10-28 05:12:54 【问题描述】:

我尝试将

ostream& operator<< (ostream& output, const Box& B)
        output << B.l << " " << B.b << " " << B.h;
        return output;

我尝试将如上所示的

friend ostream& operator<< (ostream& output, const Box& B)
        output << B.l << " " << B.b << " " << B.h;
        return output;

【问题讨论】:

是的,正如您已经检查过的,第二个解决方案是正确的。 “没用”不是对问题的描述,虽然我猜你忘记标记第一个方法static 【参考方案1】:

在这个伪示例中

class Thing

  ...
  void work(int arg);
  ...
;

成员函数是一种函数,隐含地将Thing 作为第一个参数,就像my_thing.work(12)work(my_thing, 12)。 这绝对不是一个有效的替代,而只是为其余的解释提供思路。

回到你的例子,当你写std::cout &lt;&lt; my_box时,编译器理解运算符&lt;&lt;的用法,因为这个函数调用operator&lt;&lt;(std::cout, my_box)。 如果operator&lt;&lt; for Boxstd::cout 的成员函数,这可能会起作用,但实际上标准流对您的Box 类型一无所知。

如果您提供operator&lt;&lt; 作为Box 的成员函数,则意味着左操作数(如上面的伪示例中所述可以被视为隐藏的第一个参数)应该是@987654334 @。 但是当你写std::cout &lt;&lt; my_box时,左边的操作数不是Box而是std::cout

在这种情况下,唯一的解决方案是以正确的顺序提供具有预期参数的 非成员 函数,因此您尝试并发现第二个解决方案有效。

【讨论】:

以上是关于在cpp中重载<<运算符的正确方法是啥[重复]的主要内容,如果未能解决你的问题,请参考以下文章

cpp►常见运算符的重载

对虚函数进行重载是啥意思?

重载流插入而不违反信息隐藏?

在 C++ 中调用成员的重载 << 运算符

关系运算符重载

为新文件类型重载 >> 运算符的优雅方法是啥?