【问题标题】:operator overloading, member and non-member function, which one has priority?运算符重载,成员函数和非成员函数,哪个优先?
【发布时间】:2014-02-27 23:04:50
【问题描述】:

假设我有一个Complex 数字类,operator+ 被重载了两次,既作为成员函数又作为全局函数,例如:

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

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

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

将调用哪个operator+ 函数?谢谢!

【问题讨论】:

  • Operator overloading的可能重复
  • @KevinDTimm 抱歉,我已经修改了帖子以显示我实际做了什么,这段代码可以正常编译
  • 运算符重载是一个定义明确的过程,在互联网上的 1000 个地方(其中一个链接在上面)中得到了回答。您的问题不是一个新问题,因此您应该使用现有资源,而不是通过再次提出相同的问题来增加噪音。
  • @KevinDTimm:我看不出另一个问题在哪里描述了当同时有成员和非成员候选人时将选择哪个候选人。我也无法理解标准的相关部分,所以我有兴趣看到这个问题的答案。
  • @KevinDTimm 我实际上已经在网上进行了一些搜索,但没有找到我所遇到的确切问题的答案..

标签: c++ operator-overloading


【解决方案1】:

一般来说,会员不优先于非会员,反之亦然。 C++ 的重载解析规则适用于选择其中一个。

出于重载决议的目的,成员函数被认为具有隐含对象参数(第 13.3.1/2 节)。所以

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

被视为接受 两个 参数:原始const Complex& c 和另一个Complex& 引用用于调用成员函数的对象(实际上是*this)。

假设我们有两个Complex 变量:

Complex c1, c2;

c1c2都不是const,所以为了调用

c1.operator+(c2)

参数c,它是一个const 引用,必须绑定到非const 参数c2

另一方面,调用

operator+(c1, c2)

两个参数ab,它们是const引用,必须绑定到非const对象,c1c2

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

如果将成员operator+的声明改为

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

那么重载就会变得不明确,编译就会失败。

【讨论】:

  • 那么两者之间没有优先级,可以调用任何一个吗?感谢您的详细说明,非常有启发性:)
  • @Brian 是的,确切地说,这取决于更复杂的因素,正如我在回答中阐述的那样
  • (重载解析是 C++ 中比较复杂的方面之一)
  • 我用调试器检查过,它确实是被调用的成员函数,链接器和你想象的一样聪明..
  • @Brian: smart 与这里无关(或重要的链接器)。语言的定义是有规则的,编译器必须遵守这些规则。
【解决方案2】:

提示您如何自己找出它:Ùse 调试器以查看调用了哪个方法。

【讨论】:

    猜你喜欢
    • 2011-06-05
    • 2010-12-26
    • 1970-01-01
    • 2013-11-29
    • 1970-01-01
    • 1970-01-01
    • 2012-02-01
    • 1970-01-01
    相关资源
    最近更新 更多