《Effective C++ 中文版 第三版》读书笔记
** 条款 11:在 operator= 中处理“自我赋值” **
w = w;//赋值给自己
a[i] = a[j];//潜在的自我赋值
*px = *py;//潜在的自我赋值
方案一:
Toby& Toby::operator=(const Toby& t)
{
if(this == &t) return *this; //< 证同测试,如果是自我赋值,就不做任何事,该测试较耗时
delete pt;
pt = new pToby(*t.pt);
return *this;
}
方案二:
Toby& Toby::operator=(const Toby& t)
{
pToby* pOld = pt; //< 记住原来的 pt
pt = new pToby(*t.pt); //< 令 pt 指向 *pt 的一个副本
delete pOld; //< 删除原先的pt
return *this;
}
方案三:
class Toby{
...
void swap(Toby& t); //< 交换 *this 和 t 的数据
...
};
Toby& Toby::operator=(const Toby& t)
{
Toby tmp(t); //< 为 t 数据制作一份副本
swap(tmp); //< 将 *this 数据和上述复件的数据交换
return *this;
}
方案四:
Toby& Toby::operator=(Toby t) //< t 是被传对象的一份副本,注意这里是 pass by value,将 *this 的数据和副本放入数据交换
{
swap(t);
return *this;
}
请记住:
- 确保当对象自我赋值时 operator= 有良好的行为。其中技术包括比较“来源对象”和“目标对象”的地址、精心周到的语句顺序、以及 copy-and-swap。
- 确定任何函数如果操作一个以上的对象,而其中多个对象是同一个对象时,其行为仍然正确。