运算符重载的隐式交换

时间:2018-02-28 16:54:56

标签: c++ operator-overloading

在C ++中,运算符可能会过载。如果我有两个课程AB,例如我可以在课程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吗?

1 个答案:

答案 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使用它;它太过于无形。)