关于运算符+重载
About operator + overloading
我有以下代码片段:
#include <iostream>
using namespace std;
struct Integer{
int x;
Integer(const int val) : x(val){}
friend Integer operator+(Integer& i, Integer& j){
return Integer(j.x + i.x);
}
friend std::ostream& operator<<(std::ostream& o, Integer i){
o << i.x;
return o;
}
};
int main(){
Integer i(25), j(5), k(2020);
std::cout << (i + j + k);
return 0;
}
为什么不能编译?我收到的错误是“'operator+' 不匹配(操作数类型为 Integer and Integer
)”。为什么会这样?不是从右往左计算的吗? (j + k)
不是 Integer(2025)
,加上 i
是 Integer(25)
结果不应该是显而易见的结果,意思是 2050 吗?我哪里错了?此外,我的目标是说明为什么该代码片段无法编译,以及如何通过最多修改一行代码使其编译。 (这是他们在考试时会问我们的问题)。谢谢!
operator+
returns 按值,它 returns 是一个右值,不能绑定到对非常量的左值引用,即不能传递给 operator+
作为下一个计算的参数。
将 operator+
的参数类型更改为对 const 的左值引用,它可以绑定到右值。
friend Integer operator+(const Integer& i, const Integer& j){
// ^^^^^ ^^^^^
return Integer(j.x + i.x);
}
我有以下代码片段:
#include <iostream>
using namespace std;
struct Integer{
int x;
Integer(const int val) : x(val){}
friend Integer operator+(Integer& i, Integer& j){
return Integer(j.x + i.x);
}
friend std::ostream& operator<<(std::ostream& o, Integer i){
o << i.x;
return o;
}
};
int main(){
Integer i(25), j(5), k(2020);
std::cout << (i + j + k);
return 0;
}
为什么不能编译?我收到的错误是“'operator+' 不匹配(操作数类型为 Integer and Integer
)”。为什么会这样?不是从右往左计算的吗? (j + k)
不是 Integer(2025)
,加上 i
是 Integer(25)
结果不应该是显而易见的结果,意思是 2050 吗?我哪里错了?此外,我的目标是说明为什么该代码片段无法编译,以及如何通过最多修改一行代码使其编译。 (这是他们在考试时会问我们的问题)。谢谢!
operator+
returns 按值,它 returns 是一个右值,不能绑定到对非常量的左值引用,即不能传递给 operator+
作为下一个计算的参数。
将 operator+
的参数类型更改为对 const 的左值引用,它可以绑定到右值。
friend Integer operator+(const Integer& i, const Integer& j){
// ^^^^^ ^^^^^
return Integer(j.x + i.x);
}