条款10:令operator=返回一个reference to *this
为了实现连锁赋值,赋值操作符必须返回一个reference指向操作符的左侧实参。
条款11:在operator=中处理“自我赋值”
对于赋值操作符应能实现对象的自我赋值。否则会造成“在停止使用资源之前意外释放了它”。常见的解决方案有三种:
1、赋值之前进行证同测试,比较“源对象”和“目标对象”的地址。
if(this == &rhs) return *this;
2、精心周到的语言顺序。
Bitmap *pOrig = pb;//记住原来的pb
pb = new Bitmap(*rhs.pb);//令pb指向*pb的一个复件
delete pOrig;
3、copy-and-swap技术。
让operator=具备“异常安全性”往往自动获得“自我赋值安全性”。
条款12:复制对象时勿忘其每一个成分
如果你为class添加一个成员变量,你必须同时修改class中所有的自己定义的构造函数、copy构造函数以及赋值运算符。(此时遗漏任何的成员变量编译器不给提醒)。
在为子类定义copy构造函数和赋值运算符时不仅要确保复制所有的local成员变量,也要调用所有的基类内适当的copy构造函数和赋值运算符(否则的话系统将调用default构造函数)。
不应该让copy构造函数和赋值运算符互相调用。(赋值运算符调用copy构造函数会造成试图构造一个已经存在的对象,而copy构造函数调用赋值运算符会对一个尚未构造好的对象赋值)应该将共同机能放在第三个函数中并由两个函数共同调用。