正在确定Plusequals运算符语法

Determining Plusequals Operator Syntax

本文关键字:运算符 语法 Plusequals      更新时间:2023-10-16

我对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);
}

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

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

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

Utility &Utility::operator+=(Utility const &right) { 
    intValue += right.intValue;
    return *this;
}

通常,人们会期望+=修改左手操作数,最好避免用operator +实现它,这会导致创建临时值。

此外,

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

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

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

但如果你可以在没有operator+的情况下对Utility进行内部修改,那会更好。