转换构造函数的问题,大侠求救
- C/C++ code
#include<iostream.h>class Complex{public: Complex(){real=0;imag=0;} //构造函数 Complex(float r,float i){real=r;imag=i;} //带参构造函数 Complex(float r){real=r;imag=0;} //转换构造函数 friend Complex operator +(Complex&,Complex&); friend ostream& operator <<(ostream&,Complex&);private: float real; float imag;};//对'+'重载Complex operator +(Complex&c1,Complex&c2){ return ( Complex(c1.real+c2.real,c1.imag+c2.imag) );};//对"<<"重载ostream& operator <<(ostream&output,Complex&c){ output <<c.real<<"+"<<c.imag<<"i."<<endl; return output;};int main(){ Complex c1(1,2),c2(3,4),c3; cout <<"c1="<< c1<<endl; cout <<"c2="<< c2<<endl; cout <<"c1+c2="<<c1+c2<<endl; c3=c1+5; cout <<"c1+5="<<c3<<endl; c3=6+c2; cout <<"6+c2="<<c3<<endl; return 0;}这个程序错误提示 error C2678: binary '+' : no operator defined which takes a left-hand operand of type 'const int' (or there is no acceptable conversion)
问题是:为什么不行,按照课本上说c3=c1+5,首先寻找有没有对+重载,发现有,但是类型不对,不能调用,然后又没有对float进行中重载,因此不可能把c1转换成float类型,最后寻找有没有转换构造函数,发现有,就调用转换构造函数
Complex(5),建立一个临时的Comlex类对象,再调用operator+函数,相加赋给c3,
但是实际上运行的时候不行,为什么呢?
不会又是编译器的问题吧,我被编译器坑了几次了!!
[解决办法]
friend Complex operator +(Complex&,Complex&);
friend ostream& operator <<(ostream&,Complex&);
这2句当中Complex& 要用 const 限定,这样能接受非const参数和const参数
这里面的Conplex &又不会修改
[解决办法]
呵呵,你重载的 + 是两个Complex类型的相加运算。
c3=c1+5;
cout <<"c1+5="<<c3<<endl;
c3=6+c2;
cout <<"6+c2="<<c3<<endl;
这两个地方却是 Complex与整型的相加算,你还要再重载一个Complex与整型的 +
[解决办法]
我觉得关键在于 friend Complex operator +(Complex&,Complex&); 后面的那个 Complex &
由于是引用调用,编译器应该不会自动生成一个临时对象。
你试试把 & 去掉。
我没测试过,不大清楚。
[解决办法]
另外,楼上说得对,应该在
friend Complex operator +(Complex&,Complex&);
friend ostream& operator <<(ostream&,Complex&);
加上 const , 保证传入的参数是不会被内部修改的。
[解决办法]
friend Complex operator +(Complex&,Complex&);
改成 friend Complex operator +(const Complex&,const Complex&);
下面函数的实现部分也改下,应该就可以了。
问题不在于转换构造本身,而在于重载+参数表没用const限定
把楼主的代码改动几个小地方就编译通过
- C/C++ code
#include<iostream>using namespace std;class Complex{public: Complex(){real=0;imag=0;} //构造函数 Complex(float r,float i){real=r;imag=i;} //带参构造函数 Complex(float r){real=r;imag=0;} //转换构造函数 friend Complex operator +(const Complex&,const Complex&); friend ostream& operator <<(ostream&,const Complex&);private: float real; float imag;};//对'+'重载Complex operator +(const Complex&c1,const Complex&c2){ return ( Complex(c1.real+c2.real,c1.imag+c2.imag) );};//对"<<"重载ostream& operator <<(ostream&output,const Complex&c){ output <<c.real<<"+"<<c.imag<<"i."<<endl; return output;};int main(){ Complex c1(1,2),c2(3,4),c3; cout <<"c1="<< c1<<endl; cout <<"c2="<< c2<<endl; cout <<"c1+c2="<<c1+c2<<endl; c3=c1+5; cout <<"c1+5="<<c3<<endl; c3=6+c2; cout <<"6+c2="<<c3<<endl; return 0;}
[解决办法]