为什么我们发送一个 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
个对象一起使用
当我们想要创建一个 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
个对象一起使用