zoukankan      html  css  js  c++  java
  • Effective C++ .10,11 operator=的约定与注意

    1. 返回一个reference to *this

    返回一个指向自身的引用符合惯例,可以进行如(a=c).modify()类似的操作,即可以形成链式操作,否则修改的只是一个临时对象。这个和Java中常用的builder模式是一个道理

    2. 自我赋值的检测和异常安全

    赋值进行前进行自我检测,相同就直接返回。如果不进行检测,很容易造成资源的错误释放,导致无法复制(自己的资源被释放了)。

    class Data {
    private:
        int* data;
        int len;
    public:
        Data(int cnt) {
            if (cnt < 0) {
                cnt = 0;
            }
            data = new int[cnt];
            len = cnt;
        }
        
        Data& operator=(const Data& rhs) {
            if (&rhs == this) {
                return *this;
            }
            
            delete data;
            data = new int[rhs.len];
            for (int i=rhs.len; i>=0; i--) {
                data[i] = rhs.data[i];
            }
            return *this;
        }
        
        void set(int idx, int value) {
            if (idx >= len || idx < 0) {
                return;
            }
            data[idx] = value;
        }
        int get(int idx) {
            if (idx >= len || idx <0) {
                return 0;
            }
            return data[idx];
        }
    };

    当然也可以照书上的写法把这个改成更好的形式:

        Data& operator=(const Data& rhs) {
            int* olddata = data;
            int* newdata = new int[rhs.len];
            for (int i=rhs.len; i>=0; i--) {
                newdata[i] = rhs.data[i];
            }
            data = newdata;
            delete olddata;
            return *this;
        }

    即确保新资源拿到后复制完成后再进行老的资源释放

  • 相关阅读:
    LCPhash求解
    BSGS
    洛谷—— P1849 [USACO12MAR]拖拉机Tractor
    BZOJ——2101: [Usaco2010 Dec]Treasure Chest 藏宝箱
    洛谷—— P1561 [USACO12JAN]爬山Mountain Climbing
    BZOJ——1601: [Usaco2008 Oct]灌水
    洛谷—— P1342 请柬
    [SDOI2009]Elaxia的路线 SPFA+Topo
    1737 配对
    51Nod 1378 夹克老爷的愤怒
  • 原文地址:https://www.cnblogs.com/lailailai/p/4176921.html
Copyright © 2011-2022 走看看