为什么在具有多个参数的重载 operator+ 中通过 const 引用传递
Why pass by const reference in overload operator+ with multiple parameters
我正在使用多个参数进行 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;
}
无法编译并且return“不匹配运算符+”。我阅读并理解了 ((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;
};
但我不知道为什么。谢谢
看看你的operator+
签名:
friend Integer operator+ (Integer & a, Integer & b)
// ^^^^^^^^^ ^^^^^^^^^
a
和 b
是 左值引用 .
写的时候
Integer d = a+b+c;
a+b
产生类型 Integer
的 rvalue,它不绑定到 Integer&
。
带有 const Integer &
的版本作为 const
左值引用可以绑定到 lvalues 和 rvalues .
执行 a+b+c;
将首先使用 a
和 b
调用 operator +
,这将产生一个临时的 Integer
对象,然后调用 operator +
使用那个临时对象和 c
。无法第二次调用 operator +
,因为不能将临时对象作为对非 const 限定对象的引用传递。
声明 operator +
接受非常量引用无论如何都没有意义,因为对象传递没有被修改。
我正在使用多个参数进行 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;
}
无法编译并且return“不匹配运算符+”。我阅读并理解了 ((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;
};
但我不知道为什么。谢谢
看看你的operator+
签名:
friend Integer operator+ (Integer & a, Integer & b)
// ^^^^^^^^^ ^^^^^^^^^
a
和 b
是 左值引用 .
写的时候
Integer d = a+b+c;
a+b
产生类型 Integer
的 rvalue,它不绑定到 Integer&
。
带有 const Integer &
的版本作为 const
左值引用可以绑定到 lvalues 和 rvalues .
执行 a+b+c;
将首先使用 a
和 b
调用 operator +
,这将产生一个临时的 Integer
对象,然后调用 operator +
使用那个临时对象和 c
。无法第二次调用 operator +
,因为不能将临时对象作为对非 const 限定对象的引用传递。
声明 operator +
接受非常量引用无论如何都没有意义,因为对象传递没有被修改。