运算符重载在VS2008里运行有点错误,请大哥大姐们赐教
#include<iostream>
using namespace std;
class Complex
{
public:
Complex(){real=0;imag=0;}
Complex(double r,double i){real=r;imag=i;}
friend Complex operator+(Complex &c1,Complex &c2);
friend Complex operator + (Complex &c1,double &d);
friend Complex operator + (double &d, Complex &c);
friend void display(Complex &c2);
private:
double real;
double imag;
};
//下面定义友元函数
//复数相加: (a+bi)+(c+di)=(a+c)+(b+d)i.
Complex operator+(Complex &c1,Complex &c2)
{
Complex c;
c.real=c1.real+c2.real;
c.imag=c1.imag+c2.imag;
return c;
}
Complex operator+(Complex &c1,double &d)
{
return Complex(c1.real+d, c1.imag);
}
Complex operator+(double &d, Complex &c1)
{
return Complex(c1.real+d, c1.imag);
}
void display(Complex &c2)
{
cout<<"("<<c2.real<<","<<c2.imag<<"i)"<<endl;
}
int main()
{
Complex c1(3,4),c2(5,-10),c3,c4;
c4=c1+3.14;
cout<<"c1+3.14=";
display(c4);
c4=3.14+c1;
cout<<"3.14+c1=";
display(c4);
system("pause");
return 0;
}
[解决办法]
#include<iostream>using namespace std;class Complex{public: Complex(){real=0;imag=0;} Complex(double r,double i){real=r;imag=i;} friend Complex operator+(Complex &c1,Complex &c2); friend Complex operator + (Complex &c1,double d); friend Complex operator + (double d, Complex &c); friend void display(Complex &c2);private: double real; double imag;};//下面定义友元函数//复数相加: (a+bi)+(c+di)=(a+c)+(b+d)i.Complex operator+(Complex &c1,Complex &c2) { Complex c; c.real=c1.real+c2.real; c.imag=c1.imag+c2.imag; return c; } Complex operator+(Complex &c1,double d){ return Complex(c1.real+d, c1.imag);}Complex operator+(double d, Complex &c1){ return Complex(c1.real+d, c1.imag);}void display(Complex &c2) { cout<<"("<<c2.real<<","<<c2.imag<<"i)"<<endl; } int main(){ Complex c1(3,4),c2(5,-10),c3,c4; c4=c1+3.14; cout<<"c1+3.14="; display(c4); c4=3.14+c1; cout<<"3.14+c1="; display(c4); system("pause"); return 0;}
[解决办法]
上面改法为一种,但d用成引用类型并无不妥。在此可能就是运算符重载后带来的问题了。
保持d为引用,还有两种改法:
(1)用const double &d,与c1+3.14相符了,且也指明了即使d为变量,在函数中是不允许修改的。
(2)声明double型变量:double dd=3.14,然后:c3=c1+dd。显然这种方法给重载的运算符的使用套上了枷锁(只能加变量不能加常量),并不可取。
在以上的三种方法中,倾向于用const的方案。
[解决办法]
运算符重载时传入的参数应该接受右值常量,否则表达式里就不能用常量和立即数。一般的类应该用常量左值引用,大部分基本类型(int char等)用值传递。double类型占8字节,在64位系统上建议传值,32位系统用常量左值引用也行,可以根据实际应用环境权衡。