zoukankan      html  css  js  c++  java
  • 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);
        }
    }
    
  • 相关阅读:
    怎样才有资格被称为开源软件
    [翻译]开发Silverlight 2.0的自定义控件
    网上Silverlight项目收集
    Google 分析的基准化测试
    IIS 承载的WCF服务失败
    Lang.NET 2008 相关Session
    Silverlight 2.0 beta1 堆栈
    asp.net 性能调较
    SQL Server 2005 的nvarchar(max),varchar(max)来救火
    LINQPad
  • 原文地址:https://www.cnblogs.com/logchen/p/10165423.html
Copyright © 2011-2022 走看看