C++ 杂记

条款 11:在 operator= 中处理“自我赋值”

2017-07-22  本文已影响0人  赵者也

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;
}

请记住:

  1. 确保当对象自我赋值时 operator= 有良好的行为。其中技术包括比较“来源对象”和“目标对象”的地址、精心周到的语句顺序、以及 copy-and-swap。
  2. 确定任何函数如果操作一个以上的对象,而其中多个对象是同一个对象时,其行为仍然正确。
上一篇下一篇

猜你喜欢

热点阅读