我编写了一个 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.如何?
答案 0 :(得分:2)
当我们弄清c+10
的含义时,我们会执行一个称为重载解析的过程,该过程首先通过名称查找找到所有可行的候选者。
在这种情况下,可行的候选人是:
MyComplex::operator+(MyComplex&, int); // via c.operator+(10)
::operator+(int, int); // via c.operator int() + 10
然后我们看看哪个转换顺序更好。对于第一次重载,不需要进行转换 - c
是MyComplex
的完全匹配,10
是int
的完全匹配。对于第二个重载,第二个参数是完全匹配,但第一个参数必须通过MyComplex::operator int()
进行用户定义的转换。
完全匹配的排名高于转化,因此首选过载是首选。
请注意,如果您的MyComplex::operator+()
取代long
(例如),则调用将不明确。每个重载都有一个更好的和一个更差的转换序列。