条款- 11 在 operator= 中处理“自我赋值”
- 确保当对象自我赋值时 operator= 有良好行为。其中技术包括比较“来源对象” 和 “目标对象”的地址、精心周到的语句顺序、以及 copy-and-swap。
- 确定任何函数如果操作一个以上的对象,而其中多个对象是同一个对象时,其行为仍然正确。
“自我赋值”很容易被使用,虽然没有意义,但若不加以 处理会造成系统报错。
-
法 1 传统做法:在 operator= 里做一个“证同测试( identity test )”达到“自我赋值”的检测目的。
widget& widget::operator=( const widget& rhs ){ if ( this == &rhs ) return *this; // 证同测试( identity test ) // 如果是自我赋值,就不做任何事 delete pb; pb = new Bitmap( *rhs.pb ); return *this; }
-
法2 拷贝副本,让operator= 具备异常安全性
widget& widget::operator=( const widget& rhs ){ Bitmap* pOrig = pb; // 记住原先的 pb pb = new Bitmap( *rhs.pb ); // 令 pb 指向 *pb 的一个副本 delete pOrig; // 删除原先的 pb return *this; }