在C++中,运算符可以重载。如果我有两个类A
和B
,例如我可以重载类A
中的operator ==
以与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
,编译器会寻找bool operator ==(const A &a)
在B类。如果未找到,则C++规范化中是否存在默认行为?编译器(无论它是什么)会在失败时退出还是运行bool operator ==(const B &b)
?
更好的是,如果它在B
类找不到operator < ()
,它会尝试在A
类中operator >=()
吗?
不,它也不会。重载运算符没有什么特别之处;它们只是具有有趣语法的重载函数。所以上面的代码a == b
无非是对a.operator==(const B&)
的调用。
当然,b == a
失败的原因是没有b.operator==(const A&)
(同样,也没有全局运算符)。
处理这个问题的通常方法是有一个全局operator==
而不是一个成员:bool operator==(const A&, const B&)
,以及另一个相反的全局operator==
:bool operator==(const B&, const A&)
;如果比较实际上是对称的,那么第二个可以通过调用第一个来简单实现:bool operator==(const B& b, const A& a) { return a == b; }
。
同样的原则也适用于operator<
:它不会走另一条路,如果你想要一个这样做的,你必须写它。
(小字:请忽略 - 有std::relops
(拼写更正想要将"relops"更改为"复发")将提供这些变体;不要使用它;它太侵入了。