运算符重载,成员和非成员函数,哪一个优先?

时间:2014-02-27 23:04:50

标签: c++ operator-overloading

假设我有一个复数类,运算符+被重载两次,一个作为成员函数,另一个作为全局函数,如:

class Complex {
public:
    Complex operator+(const Complex& c);
};
Complex operator+(const Complex& a, const Complex& b);

在main函数中,我将调用operator +,如下所示:

Complex a, b;
Complex c = a + b;

我想知道将调用哪个运算符+函数?谢谢!

2 个答案:

答案 0 :(得分:8)

一般情况下,成员不优先于非成员,反之亦然。 C ++的重载决策规则适用于选择其中一个。

为了重载解析,成员函数被认为具有隐含对象参数(§13.3.1/ 2)。所以

Complex Complex::operator+(const Complex& c);

被视为需要两个参数:const Complex& c,另一个Complex&引用用于调用成员函数的对象(实际上,{{1} }})。

在您的示例中,*thisc1都不是c2。所以为了打电话

const

c1.operator+(c2) 引用const必须绑定到非c const。另一方面,要打电话

c2

<{em>} operator+(c1, c2) a都是b引用,必须绑定到非const个对象,constc1

成员c2更好,因为operator+const Complex&, Complex&的匹配比c1, c2更好,因为它执行的资格转换次数较少。 (§13.3.3.2/ 3)

如果您将成员const Complex&, const Complex&的声明更改为

operator+

然后重载将变为不明确,编译将失败。

答案 1 :(得分:-2)

有点提示如何自己找到它:Ù使用调试器来查看调用哪种方法。