当我们想要创建一个类特定的ostream对象时,我没有得到这种编写实现方式背后的直觉。
friend ostream& operator<<(ostream& out, Object& obj);
它有这样的用途。在与运算符重载一起使用时,它被传递了一个参数。但在定义过程中,我们已经编写了ostream&out作为第一个参数。它是如何传递引擎盖下的第一个参数的?这是一种我不知道的发送参数的隐含方式吗?最后,被引用的out对象存储在哪里?它是由重载函数自动调用的全局变量吗?
cout << obj
friend ostream& operator<<(ostream& out, Object& obj);
是一个二进制运算符(如+
、-
…(。它接受2个操作数并返回一些值。
在这种情况下,它是
auto result = operand1 << operand2;
其中result
是operand1
(原始ostream
(
就像
int operator+(int operand1, int operand2);
int result = operand1 + operand2;
顺便说一句,你没有创建
类特定的ostream对象
您只是为用户定义的类型定义流式操作符,以便使用ostreams。因此,当您编写像some_ostream << myObject;
这样的表达式时,您正在定义应该发生什么std::ostream
并不神奇地知道如何处理您的类,所以您必须为您的类型定义该运算符才能使用它
编辑:
作为";S.M.";在一条注释中指出,此运算符应该返回原始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
对象一起使用