gpt4 book ai didi

c++ - 为什么在后面的运算符重载中需要使用const?

转载 作者:行者123 更新时间:2023-11-30 01:41:58 24 4
gpt4 key购买 nike

这是添加 3 个 Integer 类对象的代码

#include <iostream>
using namespace std;
class Integer
{
int value;
public:
Integer(int i)
{
value = i;
};
int getValue()
{
return value;
}
friend Integer operator+(const Integer & a,const Integer & b)
{
Integer i(a.value+b.value);
return i;
}
};
int main()
{
Integer a(1), b(2), c(3);
Integer d = a + b + c; //****HERE****
cout << d.getValue() << endl;
return 0;
}

有人可以解释为什么在这种情况下将 const 添加到参数中。如果我删除 const,在编译期间我会得到 invalid operands to binary operation 错误。添加到这个问题: 当我只添加 a 和 b 而没有 const 时,输出是 3 没有任何错误。但是,添加 3 个 a+b+c 对象时,出现错误。这是为什么?

最佳答案

假设我们编写了这个函数:

friend Integer operator+(Integer& a, Integer& b);

在风格上,这不是很好,因为 operator+ 不应该修改它的参数。但是假设我们不关心这个。现在,当我们尝试这样做时会发生什么:

Integer d = a + b + c;

这被分组为 (a+b)+ca+b 子表达式将找到我们的 operator+(),这是一个可行的函数,因为 abInteger 类型的非 const 左值,并且该表达式的结果是 Integer 类型的右值。

随后的表达式是{some rvalue Integer} + c那个 表达式我们将无法为其找到可行的函数。虽然 c 可以绑定(bind)到 Integer&,但第一个参数不能 - 您不能将右值绑定(bind)到非 const 左值引用。所以你必须写这样的东西:

Integer tmp = a + b; // OK
Integer d = tmp + c; // also OK

但现在我们将这个额外的名称引入我们的范围,并在我们的代码中引入一个额外的语句,只是为了解决我们函数签名的不可行性问题。

关于c++ - 为什么在后面的运算符重载中需要使用const?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40424999/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com