为什么我们发送一个 ref to ostream object 到 ostream 重载?

Why do we send a ref to ostream obj to ostream overloadings?

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

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

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

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

是二元运算符(如 +-、...)。它需要 2 个操作数和 returns 东西。

在这种情况下是

auto result = operand1 << operand2;

with result being operand1 (original ostream)

就像

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

顺便说一句。你没有创建

class-specific ostream object

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

编辑:

作为“S.M。”在评论中指出,此运算符应 return 原始 std::ostream&(左操作数)的原因是,您可以链式调用此运算符:

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 个对象一起使用