如果您将 operator<<
定义为成员函数, 它将会有与使用非成员 operator <
不同的解构语法。 一个非成员 operator<<
是一个二进制运算符, 其中成员 operator <
是一个非成员运算符 。
// Declarations
struct MyObj;
std::ostream& operator<<(std::ostream& os, const MyObj& myObj);
struct MyObj
{
// This is a member unary-operator, hence one argument
MyObj& operator<<(std::ostream& os) { os << *this; return *this; }
int value = 8;
};
// This is a non-member binary-operator, 2 arguments
std::ostream& operator<<(std::ostream& os, const MyObj& myObj)
{
return os << myObj.value;
}
那么... 您如何真正称呼它们? 运算符在某些方面是奇特的, 我将挑战您在您头上写下 < code> operator<< > (...) code> 语法, 以便让事情有意义 。
MyObj mo;
// Calling the unary operator
mo << std::cout;
// which decomposes to...
mo.operator<<(std::cout);
或者你可以试图调用非会员二进制操作员:
MyObj mo;
// Calling the binary operator
std::cout << mo;
// which decomposes to...
operator<<(std::cout, mo);
您没有义务让这些操作员在将其变成成员函数时直觉地行为, 您可以定义 < code> operator< & lt; (int) code> 以左移某个成员变量, 如果您想要的话, 理解人们可能有点被疏远, 无论您写多少评论 。
几乎最后,也许有两种情况下 操作员电话的分解都是有效的, 你可能会陷入麻烦 在这里,我们将推迟 对话。
最后,请注意写出一个像二进制运算符的无名成员运算符(因为您可以将成员运算符变成虚拟...................................
struct MyObj
{
// Note that we now return the ostream
std::ostream& operator<<(std::ostream& os) { os << *this; return os; }
int value = 8;
};
这个语法现在会刺激很多编码员...
MyObj mo;
mo << std::cout << "Words words words";
// this decomposes to...
mo.operator<<(std::cout) << "Words words words";
// ... or even further ...
operator<<(mo.operator<<(std::cout), "Words words words");
请注意 < code> cout 是如何在此链条中的第二个参数... 。 奇数?