0

我对 c++ 相当陌生,并且正在尝试了解自定义运算符。我目前遇到的问题与定义我自己的 += 运算符以及解决它的最佳方法有关。这涉及一个简单的类,该类具有可以添加的公共 int 成员 (intValue)。据我所知,以下两个代码示例(我一次尝试过一个)在我的程序中的操作完全相同。“完全相同”是指我得到相同的结果并创建相同数量的对象。

哪一个更正确(标准做法),为什么?

Utility& operator +=(Utility& left, Utility right)
{
    return left = left + right;
}

或者

void operator +=(Utility& left, Utility right)
{
    left = left + right;
}

而且,如果重要的话,他们打电话给接线员:

Utility operator +(Utility left, Utility right)
{
    return Utility(left.intValue + right.intValue);
}

每当调用其构造函数时,该类都会打印出一条消息,因此我可以判断是否正在创建一个新对象。基于这两种形式的 += 我在这里尝试导致创建相同数量的对象。

4

2 回答 2

2

由于+=通常会修改其左侧操作数,因此您通常宁愿根据operator+(需要创建一个临时值来保存结果)来实现它。

同样,由于您无法合理地对左操作数进行转换,因此它实际上应该是一个成员函数。

Utility &Utility::operator+=(Utility const &right) { 
    intValue += right.intValue;
    return *this;
}
于 2013-02-17T05:59:59.987 回答
2

通常,人们希望+=修改左侧操作数,如果您避免使用它来实现它operator +会导致创建一个临时值会更好。

除了,

Utility& operator +=(Utility& left, Utility right)
{
    return left = left + right;
}

在返回结果的意义上比另一个更好。这使用户能够编写复合表达式,例如:

Utility utility1 , utility2;
Utility ut += (utility1 += utility2);

但是如果你可以在Utility没有 的情况下修改内部operator+,那就更好了。

于 2013-02-17T06:07:05.420 回答