码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2018-12-23 20:48:12      阅读:190      评论:0      收藏:0      [点我收藏+]

标签:析构   对象   cpp   可见性   赋值运算符   tmp   opera   this   wap   

//############################################################################
/*
 * 处理拷贝赋值运算符=中自赋值的情况
 *
 *
 * 运算符重载: 利用人们的直觉,减少学习曲线
 */
// 自赋值的情况
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++进阶--处理拷贝赋值运算符中自赋值的情况

标签:析构   对象   cpp   可见性   赋值运算符   tmp   opera   this   wap   

原文地址:https://www.cnblogs.com/logchen/p/10165423.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!