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;
    }

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

posted @ 2014-12-21 19:30  卖程序的小歪  阅读(230)  评论(0编辑  收藏  举报