为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

白衣染霜花 2021-12-08 11:07:02
#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就没问题啦求大神求解决,谢谢啦! {
查看完整描述

3 回答

?
莫回无

TA贡献1865条经验 获得超7个赞

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

查看完整回答
反对 回复 2021-12-12
?
慕运维8079593

TA贡献1876条经验 获得超5个赞

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

查看完整回答
反对 回复 2021-12-12
?
临摹微笑

TA贡献1982条经验 获得超2个赞

这个问题挺有意思。
我认为形参不加const,将调用形参的拷贝构造函数先复制一个对象出来,而Complex类没有拷贝构造函数也不会接受int型的参数,所以编译报错。

加const后,函数不会复制实参,在调试过程中发现调用了Complex(int a)这个构造函数,我猜想可能编译器在这个时候做了个隐含的类型转换吧,c3=c1+a;估计就变成了c3=c1+(Complex)a;

查看完整回答
反对 回复 2021-12-12
  • 3 回答
  • 0 关注
  • 252 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信