在C ++中,运算符可能会过载。如果我有两个课程A
和B
,例如我可以在课程operator ==
中重载A
,以便与B
的实例进行比较:
class A {
// Some attributes, methods
public:
bool operator ==(const B &b) {
// Implementation of operator ==
}
}
然后我可以运行如下代码:
A a;
B b;
if(a == b) {
// Some code
}
但是,如果我写b == a
,编译器会查找
B类中的bool operator ==(const A &a)
。如果找不到,C ++规范化中是否存在默认行为?编译器,无论是什么,都会在失败时退出或改为运行bool operator ==(const B &b)
?
更好的是,如果它在课程operator < ()
中找不到B
,它会在课程operator >=()
中尝试A
吗?
答案 0 :(得分:2)
不,它不会做任何一件事。重载运算符没有什么特别之处;他们只是用有趣的语法重载功能。因此,上面代码中的a == b
只不过是对a.operator==(const B&)
的调用。
b == a
失败的原因当然是没有b.operator==(const A&)
(同样地,没有全局运算符)。
处理此问题的常用方法是拥有全局 operator==
而不是成员:bool operator==(const A&, const B&)
,以及另一个全球 { {1}}另一种方式:operator==
;如果比较实际上是对称的,那么第二个可以通过调用第一个来实现:bool operator==(const B&, const A&)
。
同样的原则也适用于bool operator==(const B& b, const A& a) { return a == b; }
:它没有反过来,如果你想要一个,那你必须写它。
(小字:请忽略 - 有operator<
(拼写纠正想要改变&#34;重新安排&#34;到#34;复发&#34;)将提供这些变体; don& #39; t使用它;它太过于无形。)