C ++:重载operator + =和operator- =时是否需要自我赋值检查?

时间:2016-03-12 17:56:08

标签: c++ operator-overloading

重载operator+=operator-=时是否需要自行分配检查,例如下面的示例?

示例:

class A
{
     A operator+=(const A& a)
     {
         if(this != &a)
         {
             // operations
         }

         return *this;
     }
}

5 个答案:

答案 0 :(得分:4)

  

在C ++中重载操作符+ =和 - =时,是否需要自我分配检查,如下所示?

不,不是。事实上,这样做似乎是错误的。

使用时完全合法且语义有效:

overflow-x:hidden;

此处的期望是int i = 10; i += i; 将在该操作结束时设置为i

答案 1 :(得分:3)

  

在C ++中重载操作符+=-=时,是否需要进行自我分配检查(如下所示)?

不,它不是必需的,甚至是错的。自检在这里应用了错误的语义。为什么不能将A添加到自身?

考虑使用自定义字符串类的示例:

MyString s = "abc";
s += s;

无辜的​​读者会期望s的价值是什么? "abc""abcabc"

操作员也应该返回对当前实例的引用:

    A& operator+=(const A& a) {
  // ^ ...
    }

答案 2 :(得分:2)

由于您正在弄乱对象的内部状态,因此可能需要进行“自检”以确保一致地访问对象,但这不是自我分配检查。 a += a当然不应导致a不变。

答案 3 :(得分:1)

自我分配测试,例如出于效率原因,if (this != &a)通常是为赋值运算符operator=(const A& s)完成的,或者如果运算符在进行实际赋值之前销毁某些成员,则应避免使用已销毁的数据。然而,即便如此,它通常也是设计问题的指标。

对于operator+=operator-=,它不是必需的,更重要的是,使用它会有问题!对于例如整数,如果x == 2

x += x;

应将x更改为4.在您的课程中,您应保持相同的行为:a += a;肯定应修改a

答案 4 :(得分:0)

这完全取决于“添加”对象的含义。由于你的问题似乎是一般性的(加法可能是任何可以与赋值相结合的操作),我可以,在我的脑海中,只考虑乘法的例子。

使用bignums,乘法过程无法就地完成。目标对象必须与源不同。如果不是,则乘法将失败。

我承认这个例子并不完美。通常,您可以通过强制解决问题来避免询问有关自我分配的问题。 bignum multiply-assign可能如下所示:

bignum& operator += ( bignum& lhs, const bignum& rhs )
{
  return lhs.swap( lhs + rhs );  // lhs = lhs + rhs
}

这利用现有的operator +来执行乘法来创建临时结果,然后使用bignum的swap()成员函数智能地分配它(它有一个,对吧?)。

同样,这只是我头脑中的一个例子......而不是一个完美的例子。可能会出现需要不同策略的情况(并且您知道如何最好地操纵数据)。

[edit]上面提到了避免在资源上调用delete[]的好例子。 [/编辑]

<强> TL;博士

如果您需要检查自我分配,请执行此操作。 如果你不这样做,那就不要。