我目前正在阅读重载函数,我在本书中遇到了两个例子,但没有解释为什么它们的创建方式不同。
第一个示例重载“==”运算符,如下所示:
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;'?
答案 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引用)带到名为Passenger
和x
的{{1}},并返回y
或true
。
同时,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 )
的左手参数。