编写赋值运算符时不仅考虑自赋值和内存泄漏问题,还要考虑到异常安全,当给待赋值对象分配内存以存储资源时,要考虑可能因内存不足抛出异常,这时应该保证实例对象状态不被改变。
class A
{
/*...*/
private:
char* ps;
};
A& A::operator=(const A& rhs)
{
if (*this != rhs)
{
A temp(rhs); //这一步分配内存,如果抛出bad_alloc异常,
//原来对象状态不会改变
char* pTemp = temp.ps;
temp.ps = ps;
ps = pTemp.ps;
}
return *this;
}
如果类定义了swap函数,一种更简单有效的方式是:拷贝并交换
A& A::operator=(A rhs) //分配内存在这
{
swap(*this, rhs);//交换对象的数据成员
return *this;
}