为什么我们要给ostream obj发一个裁判给ostream-overladings



当我们想要创建一个类特定的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;

其中resultoperand1(原始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对象一起使用

最新更新