Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么这段代码不生成模糊调用错误?_C++_Operator Overloading - Fatal编程技术网

C++ 为什么这段代码不生成模糊调用错误?

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) {

我编写了一个MyComplex类,并将加号(+)操作符重载为:

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)。