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

时间:2015-02-19 20:07:24

标签: c++ operator-overloading

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

第一个示例重载“==”运算符,如下所示:

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

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

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

为什么第二个例子使用'&amp;'符号和第一个不?为什么我们不能只使用 ostream operator 而不是 ostream&amp;操作?为什么bool运营商不使用'&amp;'?

2 个答案:

答案 0 :(得分:3)

您需要<<运算符返回的值作为引用,以便它实际返回原始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?";

通过引用返回布尔值没有多大意义,因为您不希望能够操纵==运算符返回的值。

答案 1 :(得分:0)

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==。它返回bool,并将(const Passenger &x, const Passenger&y)作为参数。

第二个运营商的名称是operator<<。它返回ostream&并取(ostream &out, const Passenger& pass)

bool是C ++中低级布尔(true / false)类型的名称。因此,==会将两个const&(const引用)带到名为Passengerx的{​​{1}},并返回ytrue

同时,false左侧为<<(对ostream&的非const引用),右侧为ostream({{1} }到pass),并返回const&(对Passenger的非const引用)。

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

编译器首先执行:<<。它接受返回值,ostream&。等等。每次调用operator<<( std::cout, a )的返回值都被用作下一次调用operator<<( operator<<( std::cout, a ), b )的左手参数。