C ++运算符使用Friend函数重载。尝试添加多个对象失败

时间:2018-11-19 12:11:15

标签: c++ operator-overloading overloading

为什么编译器在第二种情况下显示“错误”? (我已经给出了完整程序的链接) 为什么我必须使用const关键字?

第一种情况:

friend Complex operator + (const Complex &,const Complex &);

Complex c5 = c1+c2+c3+c4; 

第二种情况:

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

Complex c5 = c1+c2+c3+c4; 

1st case Full Program-我得到正确的输出

2nd case Full Program-错误:“ operator +”不匹配

3 个答案:

答案 0 :(得分:2)

Complex&不会绑定到临时文件,Complex const&会绑定。

每个+返回一个临时值。

通常,您需要:

friend Complex operator + (Complex,const Complex &);

但是这里有两个const&就可以了。

答案 1 :(得分:1)

表达式c1+c2+c3+c4的解析和评估方式就像

Complex c5 = operator+(c1, operator+(c2, operator+(c3, c4)));

operator+(c3, c4)构建并返回一个临时Complex对象:一个右值。

C ++禁止将右值绑定到非常量左值引用

但是operator+(Complex&, Complex&)采用非常量左值引用。因此出现错误消息。

另一方面,operator+(Complex const&, Complex const&)引用了const左值。

答案 2 :(得分:1)

临时对象不会绑定到非常量引用。当你写这个

auto c3 = c2 + c1 + c0; 

然后将计算第一个c1+c0,并将结果传递到c2.operator+()。声明运算符为Complex&时,您就不能通过临时变量;声明为const Complex&时,则可以通过。在90%的情况下,当期望使用非常量引用时传递临时消息是逻辑错误,因此是禁止的。