存在的问题:
在类的赋值运算符函数中,需要安全处理自我赋值问题,即:
//.cpp
ClassA a1;
a1 = a1; //自我赋值
处理方法:为阻止这种现象,有三种方法:
方法1:证同测试:
A& A::operator=(const A& a)
{
if(&a == *this) return *this; //证同测试,如果是自我赋值,则不做任何事。
delete para1;
para1 = new int(a.para1);
return *this;
}
证同测试具备自我赋值安全,但不具备异常安全,即由于new出现的问题,不能解决。
方法2:安排语句顺序,复制后再删除指针:
A& A::operator=(const A& a)
{
int* tmp = para1;
para1 = new int(a.para1);
delete tmp;
return *this;
}
此方法具备异常安全同时具备自我赋值安全,但效率低,因为每次都要进行复制。
方法3:copy-and-swap技术:
条款29详细说明
//.h
Class A{
public:
void swap(A& a);
};
//.cpp
A& A::operator=(const A& a)
{
A temp(a);
swap(temp); //交换temp与*this的数据
return *this;
}
参考资料:Effective C++ 条款11