1. 程式人生 > >C++進階--處理拷貝賦值運算符中自賦值的情況

C++進階--處理拷貝賦值運算符中自賦值的情況

賦值運算符 減少 code 重載 clas 一個 his 異常 pre

//############################################################################
/*
 * 處理拷貝賦值運算符=中自賦值的情況
 *
 *
 * 運算符重載: 利用人們的直覺,減少學習曲線
 */
// 自賦值的情況
dog dd;
dd = dd;  // 看起來很傻

dogs[i] = dogs[j]; // 看起來不怎麽傻


/* 實現賦值運算符 */
class collar;
class dog {
   collar* pCollar;
   dog& operator=(const dog& rhs) {
      if (this == &rhs)
         return *this;

      collar* pOrigCollar = pCollar;  
      pCollar = new collar(*rhs.pCollar); //可能會失敗,保證異常安全
      delete pOrigCollar;
      return *this;
   }
}


/* 實現 2: 委托 */
class dog {
   collar* pCollar;
   dog& operator=(const dog& rhs) {
      *pCollar = *rhs.pCollar;   // 逐成員拷貝collar,或者調用collar的拷貝賦值運算符=
      return *this;
   }
}

/* 實現 3:copy and swap 
-- C++中析構函數和swap時強異常安全的
拷貝構造生成一個臨時對象,然後跟本對象swap
異常安全,且天然解決了自賦值問題
註意swap的可見性問題
*/
class dog {
   collar* pCollar;
   dog& operator=(const dog& rhs) {
      dog tmp_dog(rhs);
      this->swap(&tmp_dog);
      return *this;
   }
}
dog::swap(dog* rhs) {
    this->pCollar->swap(rhs->pCollar);
    //swap(this->pCollar, rhs->pCollar);
}

C++進階--處理拷貝賦值運算符中自賦值的情況