【问题标题】:Why do we send a ref to ostream obj to ostream overloadings?为什么我们要向 ostream 对象发送 ref 太 ostream 重载?
【发布时间】:2021-09-04 00:08:44
【问题描述】:

当我们想要创建一个特定于类的 ostream 对象时,我没有得到这种编写实现方式背后的直觉。

friend ostream& operator<<(ostream& out, Object& obj);

它有这样的用途。在使用 with 运算符重载时,它被传递一个参数。但在定义过程中,我们将 ostream& out 作为第一个参数。它是如何在后台传递第一个参数的?这是一种我不知道的发送参数的隐式方式吗?最后,被引用的 out 对象存储在哪里?它是一个全局变量,被重载的函数自动调用吗?

cout << obj

【问题讨论】:

  • 你在这里有一些基本的误解,所以我认为最好的办法是参考你的教科书对运算符重载及其工作原理的完整解释。你的教科书在这个话题上是怎么说的,你的教科书解释中有什么让你不清楚的地方吗?

标签: c++ ostream


【解决方案1】:
friend ostream& operator<<(ostream& out, Object& obj);

是二元运算符(如+-、...)。它需要 2 个操作数并返回一些东西。

在这种情况下是

auto result = operand1 << operand2;

resultoperand1(原来的 ostream

就像

int operator+(int operand1, int operand2);
int result = operand1 + operand2;

顺便说一句。你不是在创建一个

类特定的 ostream 对象

您只是为您的用户定义类型定义流式操作符,以使用 ostreams。所以你定义了当你写像some_ostream &lt;&lt; myObject;这样的表达式时应该发生什么 std::ostream 并不神奇地知道如何处理您的类,因此您必须为您的类型定义该运算符才能使用它。

编辑:

作为“SM”在评论中指出,此运算符应返回原始 std::ostream&amp;(左操作数)的原因是,您可以将调用链接到此运算符:

std::cout << myObj1 << " foo " << myObj2 << " bar ";

可以读作:

(((std::cout << myObj1) << " foo ") << myObj2) << " bar ";

并且等价于:

std::cout << myObj1;
std::cout << " foo ";
std::cout << myObj2;
std::cout << " bar ";

真的应该这样

friend ostream& operator<<(ostream& out, const Object& obj); // const

因为 1. 您不应该操纵该对象,并且 2. 您希望能够将其与 const 对象一起使用

【讨论】:

  • 感谢您的解释。我推测第一个参数是我们访问方法的参数,而不是编译器用来检测我们寻找的正确实现的参数。
  • @ibrahimkoz 是的,这不是std::ostream 的方法,它是一个免费函数。
  • 缺少一件重要的事情。返回的流允许像cout &lt;&lt; obj1 &lt;&lt; obj2 &lt;&lt; std::endl; 一样顺序使用流
猜你喜欢
  • 1970-01-01
  • 2012-04-21
  • 2015-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多