我正在使用多个参数进行operator +重载,如下所示。
#include <iostream>
using namespace std;
class Integer{
int value;
public:
Integer(int i) {value=i;};
int getValue() { return value;};
friend Integer operator+ (Integer & a, Integer & b){
Integer I (a.value+b.value);
return I;
};
};
int main() {
Integer a(1), b(2), c(3);
Integer d = a+b+c;
cout<<d.getValue()<<endl;
return 0;
}
无法编译并返回“不匹配运算符+”。我阅读并理解了多个参数的算法((a + b)+ c)。为什么它不起作用? 但是,我找到了两种方法来实现它:
friend Integer operator+ (const Integer & a,const Integer & b){
Integer I (a.value+b.value);
return I;
};
和
friend Integer & operator+ (Integer & a,Integer & b){
Integer I (a.value+b.value);
return I;
};
但我不知道为什么。谢谢
答案 0 :(得分:8)
查看您的operator+
签名:
friend Integer operator+ (Integer & a, Integer & b)
// ^^^^^^^^^ ^^^^^^^^^
a
和b
是左值参考。
写作时
Integer d = a+b+c;
a+b
会生成类型为Integer
的右值,但不会绑定到Integer&
。
const Integer &
的版本作为const
左值参考可以绑定到左值和右值。
答案 1 :(得分:0)
执行a+b+c;
将首先使用operator +
和a
调用b
,这将生成一个临时Integer
对象,然后使用该operator +
调用c
临时对象和operator +
。第二次调用operator +
是不可能的,因为临时对象不能作为对非const限定对象的引用传递。
声明{{1}}接受非const引用无论如何都没有意义,因为对象传递不会被修改。