C++ 为什么这段代码不生成模糊调用错误?
我编写了一个MyComplex类,并将加号(+)操作符重载为:C++ 为什么这段代码不生成模糊调用错误?,c++,operator-overloading,C++,Operator Overloading,我编写了一个MyComplex类,并将加号(+)操作符重载为: class MyComplex { public: operator int() { return realPart; } MyComplex(int r, int i=0) { realPart = r; imaginaryPart = i; } int operator +(int i) {
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?
}
class MyComplex
{
公众:
运算符int(){return realPart;}
MyComplex(int r,int i=0)
{
realPart=r;
想象部分=i;
}
int运算符+(int i){返回图像部分+i;}
私人:
int realPart,imaginaryPart;
};
int main()
{
菌复合物c(5,4);
cout当我们弄明白c+10
的意思时,我们会做一个称为重载解析的过程,首先通过名称查找找到所有可行的候选对象
在这种情况下,可行的候选人是:
MyComplex::operator+(MyComplex&, int); // via c.operator+(10)
::operator+(int, int); // via c.operator int() + 10
然后我们看哪种转换顺序更好。对于第一个重载,不需要转换-c
与MyComplex
完全匹配,10
与int
完全匹配。对于第二个重载,第二个参数是完全匹配的,但第一个参数必须经过用户定义的co通过MyComplex::operator int()
进行转换
精确匹配的秩高于转换,因此首选第一个重载
请注意,如果您的MyComplex::operator+()
使用了long
(例如),则调用将是不明确的。每个重载都会有一个更好和一个更差的转换序列。当我们弄清楚c+10
的意思时,我们会执行一个称为重载解析的过程,首先通过名称查找找到所有可行的候选对象
在这种情况下,可行的候选人是:
MyComplex::operator+(MyComplex&, int); // via c.operator+(10)
::operator+(int, int); // via c.operator int() + 10
然后我们看哪种转换顺序更好。对于第一个重载,不需要转换-c
与MyComplex
完全匹配,10
与int
完全匹配。对于第二个重载,第二个参数是完全匹配的,但第一个参数必须经过用户定义的co通过MyComplex::operator int()
进行转换
精确匹配的秩高于转换,因此首选第一个重载
请注意,如果您的MyComplex::operator+()
使用了long
(例如),则调用将是不明确的。每个重载将有一个更好和一个更差的转换序列。精确匹配更好当您编写1+2
时,可以解释为尝试添加两个整数,或者尝试将它们都转换为double
并添加它们?c+10相当于c+(10)ant性能匹配是int运算符+(int i)。当您编写1+2
时,精确匹配更好,可以解释为尝试添加两个整数,或者尝试将它们都转换为double
并添加它们?c+10相当于c+(10)ant性能匹配是int运算符+(int i)。