为什么在带有多个参数的重载运算符+中传递const引用

时间:2017-12-12 13:09:33

标签: c++ operator-overloading const pass-by-reference

我正在使用多个参数进行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;
};

但我不知道为什么。谢谢

2 个答案:

答案 0 :(得分:8)

查看您的operator+签名:

friend Integer operator+ (Integer & a, Integer & b)
//                        ^^^^^^^^^    ^^^^^^^^^

ab左值参考

写作时

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引用无论如何都没有意义,因为对象传递不会被修改。