假设我有一个复数类,运算符+被重载两次,一个作为成员函数,另一个作为全局函数,如:
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;
我想知道将调用哪个运算符+函数?谢谢!
答案 0 :(得分:8)
一般情况下,成员不优先于非成员,反之亦然。 C ++的重载决策规则适用于选择其中一个。
为了重载解析,成员函数被认为具有隐含对象参数(§13.3.1/ 2)。所以
Complex Complex::operator+(const Complex& c);
被视为需要两个参数:const Complex& c
,另一个Complex&
引用用于调用成员函数的对象(实际上,{{1} }})。
在您的示例中,*this
和c1
都不是c2
。所以为了打电话
const
c1.operator+(c2)
引用const
必须绑定到非c
const
。另一方面,要打电话
c2
<{em>} operator+(c1, c2)
和a
都是b
引用,必须绑定到非const
个对象,const
和c1
。
成员c2
更好,因为operator+
与const Complex&, Complex&
的匹配比c1, c2
更好,因为它执行的资格转换次数较少。 (§13.3.3.2/ 3)
如果您将成员const Complex&, const Complex&
的声明更改为
operator+
然后重载将变为不明确,编译将失败。
答案 1 :(得分:-2)
有点提示如何自己找到它:Ù使用调试器来查看调用哪种方法。