更一般地说,我应该让运营商超载?我知道重载+=
是一件好事,因为扩展到a = a + b
会创建一个临时对象,而重载+=
可以避免这种情况。 不重载的+=
是否会有效地使用我的重载运算符?
答案 0 :(得分:5)
如果你不重载+=
,它将不会被定义;你将无法使用它。
我个人建议您提供,因为如果+=
和+
有=
,那么可能会有{{1}}可用的人。
我还建议你使用Boost.Operators来重载应该根据其他人自动生成的运算符。
答案 1 :(得分:5)
实现operator+
,支持代码重用的最佳方法是
class Foo
{
Foo(Foo const&); // Implemented
Foo& operator+=(Foo const& rhs)
{
// Implement all the addition-specific code here
return *this;
}
};
然后
Foo operator+(Foo x, Foo const& y)
{
x += y; return x;
}
如果必须复制右侧(由于实现原因通常不是这种情况),您可以在operator+=
和{{1}的第二个参数中传递值}。
答案 2 :(得分:3)
你没有拥有。编译器不会抛出错误或警告,告诉您已完成的操作是错误的。
但是,你真的应该在绝大多数情况下。编译器不会将a += b
转换为a = a + b
。
答案 3 :(得分:3)
最好首先实施operator+=
和operator=
,因为根据它们实施operator+
是微不足道的。 IIRC这是由Scott Meyers撰写的 Effective C ++ 。
答案 4 :(得分:2)
是的,它是一个不同的运营商,所以你必须超载它。您可以(也可能应该)在重载函数中使用其他运算符(例如“+”)。
答案 5 :(得分:1)
你必须超载+ =。
然后,你可以超载它来做一些完全不同的事情,但不建议这样做。 ; - 。)
答案 6 :(得分:0)
当你说“我必须......”时,只有你需要使用它。通常最好实现operator + =然后实现operator +,因为大多数人都得到operator +错误(不要使它成为const,忘记返回副本......)
std :: accumulate使用a = a + b,如果您正在做的是写一些东西以适应它,+ =将自己没有帮助,尽管你仍然可以实现operator +。
当然,您可能决定不允许用户使用+ =修改您的对象(而您不介意他们制作副本)。
答案 7 :(得分:-3)
不,你没有。但只是不要认为,因为你超载+和=你有+ =免费。当然,你不要仅仅因为你已经超负荷而假设,而且>你也有 - >操作