为什么这两个重载函数的声明方式不同?
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 引用)到 Passenger
s 命名为 x
和 y
和 returns true
或 false
.
与此同时,<<
在左侧采用 ostream&
(对 ostream
的非常量引用),在右侧采用 pass
(const&
到 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 值用作下一次调用 <<
.
的左侧参数
我目前正在阅读有关重载函数的内容,我在书中遇到了两个示例,但没有解释为什么它们的创建方式不同。
第一个示例像这样重载“==”运算符:
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 引用)到 Passenger
s 命名为 x
和 y
和 returns true
或 false
.
与此同时,<<
在左侧采用 ostream&
(对 ostream
的非常量引用),在右侧采用 pass
(const&
到 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 值用作下一次调用 <<
.