我对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
进行内部修改,那会更好。