C++如何理解这段话

重载复数运算符+时,采用下面友元函数声明:friendComplexoperator+(Complex&c1,Complex&c2);为什么不能用于“实数+复数”?怎样改... 重载复数运算符+时,采用下面友元函数声明:

friend Complex operator+(Complex &c1,Complex &c2);

为什么不能用于“实数+复数”?怎样改进才能适用?为什么?

答:使用引用类型变量作为运算符重载函数的参数,身为左值的实数类型实参不能被转换为复数,编译时无法通过。添加const说明,使实数到复数的转换隐式地在一份拷贝上进行,则可以实现“实数+复数”运算。修改后的说明为:

friend Complex operator+(const Complex &c1, const Complex &c2);
展开
 我来答
百度网友9200c61
2008-12-22 · TA获得超过150个赞
知道小有建树答主
回答量:235
采纳率:0%
帮助的人:143万
展开全部
注意:Complex的构造函数中要有
Complex(double);
将重载复数运算符+函数修改为
friend Complex operator+(const Complex &c1, const Complex &c2);
后,运行程序

Complex c1(1.5,2.4);
Complex c2(c1-2.5);
cout<<c2<<endl;

运行结果:
-1+2.4i

系统将-2.5通过构造函数Complex(double);
转化为未命名的临时的Complex的const对象(因为-2.5为左值,不能修改)。
再将c1与新生成的 未命名的临时的Complex的const对象代入函数friend Complex operator+(const Complex &c1, const Complex &c2);
进行运算。

因为,修改前,无法按上述方式进行(const对象不能赋给非const引用),所以编译不通。
有不明白的地方,hi我!
百度网友b0e28cae4
2008-12-21 · TA获得超过4016个赞
知道大有可为答主
回答量:1275
采纳率:85%
帮助的人:619万
展开全部
呵呵,我也在复习这个哦。

比如说有:
Complex c2(1,5),c3;
c3=1.5+c2;

则处理1.5+c1时,系统发现和重载的函数
Complex operator+(Complex &c1,Complex &c2); 参数类型不匹配,身为左值的实数类型(这里是1.5)实参不能被转换为复数,编译时无法通过。
改成Complex operator+(const Complex &c1, const Complex &c2);后,系统会把1.5转换成复数(这个复数是一个无名的对象,又系统自动生成),然后这个无名的复数对象和c2就能用操作的“+”运算符相加,并把值赋给c3.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式