//############################################################################
/*
 * 处理拷贝赋值运算符=中自赋值的情况
 *
 *
 * 运算符重载: 利用人们的直觉,减少学习曲线
 */
// 自赋值的情况
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);
}
原文:https://www.cnblogs.com/logchen/p/10165423.html