首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

运算符重载在VS2008里运行有点异常,请大哥大姐们赐教

2012-04-11 
运算符重载在VS2008里运行有点错误,请大哥大姐们赐教#includeiostreamusing namespace stdclass Comple

运算符重载在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;
}


[解决办法]

C/C++ code
#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位系统用常量左值引用也行,可以根据实际应用环境权衡。

热点排行