如果我重载了+和=运算符,我是否必须重载+ =?

时间:2011-01-17 15:59:53

标签: c++ operator-overloading

更一般地说,我应该让运营商超载?我知道重载+=是一件好事,因为扩展到a = a + b会创建一个临时对象,而重载+=可以避免这种情况。 重载的+=是否会有效地使用我的重载运算符?

8 个答案:

答案 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)

不,你没有。但只是不要认为,因为你超载+和=你有+ =免费。当然,你不要仅仅因为你已经超负荷而假设,而且>你也有 - >操作