考虑代码
#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());
}
然后它工作正常。但我预计它将适用于所有被描述的情况。我们已将构造函数转换定义为。
答案 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
。
你因为没有制定者而获得金星。