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; }
即确保新资源拿到后复制完成后再进行老的资源释放