读书人

转换构造函数的有关问题大侠

发布时间: 2012-05-10 16:02:39 作者: rapoo

转换构造函数的问题,大侠求救

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;} 


[解决办法]

探讨
首先对不起,我结贴那么晚,但是按照书上您的说法是不对的

读书人网 >C++

热点推荐