因为不支持把成员函数重载为友元函数,所以用带。h的库,但是还是出错了~

#include<iostream.h>// c++6.0不支持把成员函数重载为友元函数,,所以用带。h的库 class Complex { int real; int imag; public: Complex(int a,int b):real(a),imag(b){} Complex(){}; Complex(int a){real=a;imag=0;} void display(); friend Complex operator +(Complex &c1,Complex &c2); }; Complex operator+(Complex&c1,Complex&c2) { return Complex(c1.real+c2.real,c1.imag+c2.imag);//注意返回带Cmplex } void Complex::display() { cout<<real<<'+'<<imag<<'i'<<endl; } int main() { Complex c1(1,5),c2(3,7),c3;int a=2; c3=c1+a; cout<<"c3="<<endl; c3.display(); return 0; } 我已经定义了转换构造函数,为什么c1+a会出错 为什么在complex&c1,Complex&c2)中加const就没问题啦求大神求解决,谢谢啦! {

白衣染霜花
浏览 260回答 3
3回答

莫回无

因为你的函数参数是左值引用,它不能引用到一个通过转换构造函数,临时构造的对象。只有常左值引用,即加上const,才可以引用临时对象。

慕运维8079593

c3 = c1 + Complex(a);这样就行了吧,你的构造没有定义复数与int相加再说的+运算符重载这样写不就行了Complex operator+(Complex&c1){return Complex(c1.real + real, c1.imag + imag);};

临摹微笑

这个问题挺有意思。我认为形参不加const,将调用形参的拷贝构造函数先复制一个对象出来,而Complex类没有拷贝构造函数也不会接受int型的参数,所以编译报错。加const后,函数不会复制实参,在调试过程中发现调用了Complex(int a)这个构造函数,我猜想可能编译器在这个时候做了个隐含的类型转换吧,c3=c1+a;估计就变成了c3=c1+(Complex)a;
打开App,查看更多内容
随时随地看视频慕课网APP