美文网首页C++ 杂记
条款 11:在 operator= 中处理“自我赋值”

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

作者: 赵者也 | 来源:发表于2017-07-22 10:33 被阅读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. 确定任何函数如果操作一个以上的对象,而其中多个对象是同一个对象时,其行为仍然正确。

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/zazekxtx.html