确定Plusequals运算符语法

时间:2013-02-17 05:51:52

标签: c++ operators correctness

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

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

2 个答案:

答案 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+,那就更好了。