首页 > 代码库 > Effective C++ .10,11 operator=的约定与注意

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 =http://www.mamicode.com/ data;        int* newdata = http://www.mamicode.com/new int[rhs.len];        for (int i=rhs.len; i>=0; i--) {            newdata[i] = rhs.data[i];        }        data = newdata;        delete olddata;        return *this;    }

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

Effective C++ .10,11 operator=的约定与注意