为什么这两个重载函数的声明方式不同?

Why are these two overloaded functions declared differently?

我目前正在阅读有关重载函数的内容,我在书中遇到了两个示例,但没有解释为什么它们的创建方式不同。

第一个示例像这样重载“==”运算符:

bool operator==(const Passenger &x, const Passenger&y){
//.......implementation details hidden
}

虽然第二个示例像这样重载“<<”运算符:

ostream& operator << (ostream &out, const Passenger& pass){
//.......implementation details hidden
return out;
}

为什么第二个示例使用了“&”符号而第一个示例没有?为什么我们不能只使用 ostream operator 而不是 ostream& operator?为什么布尔运算符不使用“&”?

您需要 return 由 << 运算符编辑的值作为参考,以便它实际上 return 是原始 ostream 对象而不是副本的对象。这就是将几个 << 调用串在一起的原因:

std::cout << "Hey"; // Prints "Hey" and returns cout
std::cout << passenger; // Calls custom operator and returns cout
std::cout << "What?"; // Prints "What?" and returns cout

相当于:

std::cout << "Hey" << passenger << "What?";

通过引用 return 布尔值没有多大意义,因为您不希望能够操纵 return 由 == 运算符编辑的值.

bool operator==(const Passenger &x, const Passenger&y)
ostream& operator << (ostream &out, const Passenger& pass)

添加空格:

bool         operator==     (const Passenger &x, const Passenger&y)
ostream&     operator<<     (ostream &out, const Passenger& pass)

和分类:

RETURN TYPE  FUNCTION NAME  ( PARAMETERS, MORE PARAMETERS )
bool         operator==     (const Passenger &x, const Passenger&y)
ostream&     operator<<     (ostream &out, const Passenger& pass)

第一个接线员的名字是operator==。它return是一个bool,参数是(const Passenger &x, const Passenger&y)

第二个接线员的名字是operator<<。它 return 是一个 ostream& 并且需要 (ostream &out, const Passenger& pass).

A bool 是 C++ 中低级布尔值 (true/false) 类型的名称。所以 == 需要两个 const& (const 引用)到 Passengers 命名为 xy 和 returns truefalse.

与此同时,<< 在左侧采用 ostream&(对 ostream 的非常量引用),在右侧采用 passconst&Passenger),return 到 ostream&(对 ostream 的非常量引用)。

C++ 的一个约定是 std::cout << a << b << c; 可以将数据流式传输到 ostream。该操作被认为是非常量(非 const),并且每个 << 在左侧取一个 ostream& 并且 return 是它。

编译器最终会首先执行:operator<<( std::cout, a )。它采用 return 值,并执行 operator<<( operator<<( std::cout, a ), b )。等等。每次调用 << 的 return 值用作下一次调用 <<.

的左侧参数