我对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);
}
该类在调用其构造函数时会打印出一条消息,因此我可以判断是否正在创建一个新对象。基于此,+ =我在这里尝试的两种形式导致创建相同数量的对象。
答案 0 :(得分:2)
由于+=
通常会修改其左侧操作数,因此您通常不会 以operator+
(需要创建临时值来保存)来实现它结果)。
同样,由于你无法合理地对左操作数进行转换,它应该是一个成员函数。
Utility &Utility::operator+=(Utility const &right) {
intValue += right.intValue;
return *this;
}
答案 1 :(得分:2)
通常,人们希望+=
修改左手操作数,如果你避免用operator +
实现它会导致创建一个临时值会更好。
此外,
Utility& operator +=(Utility& left, Utility right)
{
return left = left + right;
}
在返回结果的意义上,优于其他
。这使用户能够编写复合表达式,如:
Utility utility1 , utility2;
Utility ut += (utility1 += utility2);
但如果您可以在没有Utility
的情况下在内部修改operator+
,那就更好了。