在使用赋值操作符时要注意防止自我赋值的情况发生,例如
a[j] = a[i]; //是否可能存在i=j的情况
*px = *py; //是否可能指向相同
处理方法如下:
①在函数开头先进行判断(证同测试),确定值不等再进行赋值操作
② 实现异常安全性的同时避免自我赋值问题,详见Item 29(异常安全)。这是一个常见且足够好的赋值操作符撰写方法:
class Widget{
…
void swap(Widget& rhs); //交换*this和rhs的数据,详见Item 29
…
};
Widget& Widget::operator=(const Widget& rhs) //引用
{
Widget temp(rhs); //为rhs制作一份副本
swap(temp); //将*this数据与上述副本的数据交换
return *this;
}
或
Widget& Widget::operator=(const Widget rhs) //值传递的方式,直接为副本
{
swap(rhs); //将*this数据与副本的数据交换
return *this;
}