构造函数转换不适用于运算符重载

时间:2014-05-12 12:12:15

标签: c++ implicit-conversion

考虑代码

#include <stdio.h>

class complex
{
private:
    double re,im;
public:
    complex(double, double);
    complex(double);
    complex operator+(complex c);
    double getre();
    double getim();
};

complex complex::operator+(complex c)
{
    return *new complex(re+c.getre(),im+c.getim());
}

complex::complex(double real, double imagine)
{
    re= real;
    im= imagine;
}

complex::complex(double real)
{
    re= real;
    im=0;
}

double complex::getre()
{
    return re;
}

double complex::getim()
{
    return im;
}

int main()
{
    complex *z= new complex(2.0);
    complex *w= new complex(3.0, 4.0);
    printf("%f\n",(2.0+*z).getre());//Compile error: no match for ‘operator+’ in ‘2.0e+0 + * z’

}

但是如果我们将运算符成员函数替换为非成员函数,如下所示:

complex operator+(complex t, complex c)
{
    return *new complex(t.getre()+c.getre(),t.getim()+c.getim());
}

然后它工作正常。但我预计它将适用于所有被描述的情况。我们已将构造函数转换定义为。

1 个答案:

答案 0 :(得分:1)

二元运算符不会尝试任何转换到左侧参数,即函数的“接收器” 如果您想在左侧使用内置类型,则重载必须是一个自由函数。

最简单的方法通常是在这种情况下拥有一个变异成员+=,并从自由函数委托给它。

这样的事情:

complex complex::operator+=(complex rhs)
{
    re += rhs.re;
    im += rhs.im;
    return *this;
}

complex operator+(complex t, complex c)
{
    t += c;
    return t;
}    

int main()
{
    complex z(2.0);
    complex w(3.0, 4.0);
    printf("%f\n",(2.0 + z).getre());
}

你还应该让你的吸气者const

你因为没有制定者而获得金星。