重载operator+=
和operator-=
时是否需要自行分配检查,例如下面的示例?
示例:
class A
{
A operator+=(const A& a)
{
if(this != &a)
{
// operations
}
return *this;
}
}
答案 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;博士强>
如果您需要检查自我分配,请执行此操作。 如果你不这样做,那就不要。