以这种方式定义operator + =是对的吗?
void operator +=(const BigNumber& other)
{
*this=(*this) + other;
}
在这样的课程中:
class BigNumber
{
public:
//....
BigNumber operator +(const BigNumber& other)
{
return sum(other);
}
//....
}
答案 0 :(得分:6)
是。但正确的方法是在operator+
:
operator+=
struct foo
{
int value;
foo& operator+=( const foo& other )
{
value += foo.value;
return *this ;
}
friend foo operator+( foo lhs , const foo& rhs )
{
return lhs += rhs;
}
};
首先,不应将二进制operator+()
定义为成员函数而不是自由函数。这允许您在第一个参数不是foo
的情况下实现添加。常见的习惯用法是在类中声明它friend
以克服封装。
其次,这种方式提供了一个连贯,可维护和高效的界面。
如果您实施+=
操作,则用户进行操作(除极少数情况外)该类型也提供二进制加法。使用+
实现+=
可以确保两个操作的行为一致。
您已使用+
实施了+=
,因此实际执行添加的代码只会写入一次。如果您将来需要更改操作,则必须仅更改一个代码,如果它有错误,则该错误仅在一个站点中。减少代码重复通常是一种很好的做法。
编写operator+()
的方式允许编译器轻松地删除副本,从而提高二进制加法的性能。
使用的习语是“复制第一个操作数,对其进行操作,返回副本”。所以编译器可以轻松执行返回值优化(RVO)。此外,它通过值传递第一个操作数,而不是在函数内手动复制操作数。这允许编译器在第一个操作数是右值时执行更多的复制精简(让编译器决定何时以及如何复制)。
答案 1 :(得分:1)
是的,你可以按照自己的方式去做:
BigNumber& operator +=(const BigNumber& other)
{
*this=(*this) + other;
return *this;
}
通常的做法是相反的方式:
// Note a is no const reference
BigNumber operator + (BigNumber a, const BigNumber& b)
{
return a += b;
}
您的方法的推理可能是内存分配。