为什么这段代码不会产生错误的调用错误?

时间:2016-12-15 03:59:22

标签: c++ operator-overloading

我编写了一个 MyComplex 类,并将plus(+)运算符重载为:

class MyComplex
{
public:
        operator int() { return realPart; }
        MyComplex(int r, int i=0)
        {
                realPart = r;
                imaginaryPart = i;
        }

    int operator +(int i) { return imaginaryPart+i; }
private:
        int realPart, imaginaryPart;
};

int main()
{
        MyComplex c(5, 4);
        cout << c+10 << "\n"; // Why is this not ambiguous?
}

我认为表达式 c + 10 可以解释为尝试添加两个整数( c + 10 中的 c 将是使用转换运算符运算符int()降级为整数或通过重载运算符函数 int运算符+(int i)作为重载运算符调用。但程序编译时没有任何错误,并将输出生成为14.如何?

1 个答案:

答案 0 :(得分:2)

当我们弄清c+10的含义时,我们会执行一个称为重载解析的过程,该过程首先通过名称查找找到所有可行的候选者。

在这种情况下,可行的候选人是:

MyComplex::operator+(MyComplex&, int); // via c.operator+(10)
::operator+(int, int);                 // via c.operator int() + 10

然后我们看看哪个转换顺序更好。对于第一次重载,不需要进行转换 - cMyComplex的完全匹配,10int的完全匹配。对于第二个重载,第二个参数是完全匹配,但第一个参数必须通过MyComplex::operator int()进行用户定义的转换。

完全匹配的排名高于转化,因此首选过载是首选。

请注意,如果您的MyComplex::operator+()取代long(例如),则调用不明确。每个重载都有一个更好的和一个更差的转换序列。