C++ 为什么在下面的运算符重载中需要使用const?

C++ 为什么在下面的运算符重载中需要使用const?,c++,C++,这是一个用于添加Integer类的3个对象的代码 #include <iostream> using namespace std; class Integer { int value; public: Integer(int i) { value = i; }; int getValue() { return value; } friend Integer operat

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

#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;
}
#包括
使用名称空间std;
类整数
{
int值;
公众:
整数(整数i)
{ 
值=i;
};
int getValue()
{ 
返回值;
}
友元整数运算符+(常数整数&a、常数整数&b)
{
整数i(a.值+b.值);
返回i;
}
};
int main()
{
整数a(1)、b(2)、c(3);
整数d=a+b+c;//****此处****

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

friend Integer operator+(Integer& a, Integer& b);
从风格上来说,这并不好,因为
operator+
不应该修改它的参数。但假设我们不关心这一点。现在,当我们尝试这样做时会发生什么:

Integer d = a + b + c;
这被分组为
(a+b)+c
a+b
子表达式将找到我们的
运算符+()
,这是一个可行的函数,因为
a
b
整型
的非
常量
左值,并且该表达式的结果是
整型
的右值

随后的表达式是
{some rvalue Integer}+c
。我们将无法为该表达式找到可行的函数。虽然
c
可以绑定到
Integer&
,但第一个参数不能-您不能将rvalue绑定到非
const
左值引用。因此,您必须编写类似以下内容:

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

但是现在我们在我们的作用域中引入了这个额外的名称,在代码中引入了一个额外的语句,只是为了绕过函数签名的不可行性。

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

friend Integer operator+(Integer& a, Integer& b);
从风格上来说,这并不好,因为
operator+
不应该修改它的参数。但假设我们不关心这一点。现在,当我们尝试这样做时会发生什么:

Integer d = a + b + c;
这被分组为
(a+b)+c
a+b
子表达式将找到我们的
运算符+()
,这是一个可行的函数,因为
a
b
整型
的非
常量
左值,并且该表达式的结果是
整型
的右值

随后的表达式是
{some rvalue Integer}+c
。我们将无法为该表达式找到可行的函数。虽然
c
可以绑定到
Integer&
,但第一个参数不能-您不能将rvalue绑定到非
const
左值引用。因此,您必须编写类似以下内容:

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

但是现在我们将这个额外的名字引入到我们的范围中,并把一个额外的语句放入我们的代码中,以绕过函数签名的不可行性。

,因为您试图将临时绑定到非const引用,这在C++中是不允许的。
在代码
Integer d=a+b+c;
中,首先计算
a+b
,并创建一个新的临时对象,然后根据c进行计算。因此,代码随后变为
Integer d=t。它非常冗长,可能需要多次传递才能“获取”它是任何C++程序员的非常宝贵的知识。

因为你试图把临时绑定到[const ][c]的引用,这在C++中是不允许的。
在代码
Integer d=a+b+c;
中,首先计算
a+b
,并创建一个新的临时对象,然后根据c进行计算。因此,代码随后变为
Integer d=t。它非常冗长,可能需要多次传递才能“获取”它是任何C++程序员都非常有价值的知识。

如果你不使用<代码> const >它允许二进制操作符修改操作数的可能性,这是不允许的。作为样式注释,你也不改变A或B;也不想在那个运算符中使用。因此使用const也会保护你不做。那个函数中的愚蠢错误…@EliSadoff允许一个二元运算符修改操作数。它是否应该修改操作数是一个单独的问题。@EliSadoff:这个分析是不正确的。请看我刚才投票的Xirema和Barry的答案。@Bathsheba我也意识到了这一点。我自己显然误解了这个概念。如果你不使用
const
然后它允许二进制运算符修改操作数,这是不允许的。作为一种风格说明,您也不会更改a或b;您也永远不想在该运算符中更改它-因此使用const还可以保护您在该函数中避免错误地执行愚蠢的操作…@EliSadoff允许使用二进制运算符修改一个操作数。它是否应该这样做是一个单独的问题。@EliSadoff:这个分析是不正确的。请看Xirema和Barry的答案,我刚刚投了赞成票。@Bathsheba我意识到了这一点。我自己显然误解了这个概念。