C++进阶--处理拷贝赋值运算符中自赋值的情况

//############################################################################
/*
 * 处理拷贝赋值运算符=中自赋值的情况
 *
 *
 * 运算符重载: 利用人们的直觉,减少学习曲线
 */
// 自赋值的情况
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;
   }
}
//成员函数的方式
void dog::swap(dog& rhs) {
    using std::swap;
    //swap(this->pCollar, rhs->pCollar);
    this->pCollar->swap(rhs->pCollar);
    
}

//非成员函数的方式 模板全特化
namespace std {
    template<>
    void swap<dog> (dog& lhs, dog& rhs)
    {
        lhs.swap(b);
    }
}
原文地址:https://www.cnblogs.com/logchen/p/10165423.html