條款 11:在 operator= 中處理“自我賦值”

weixin_33918357發表於2017-07-22

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. 確定任何函式如果操作一個以上的物件,而其中多個物件是同一個物件時,其行為仍然正確。

相關文章