11 在 operator= 中处理“自我赋值”

条款- 11 在 operator= 中处理“自我赋值”

  • 确保当对象自我赋值时 operator= 有良好行为。其中技术包括比较“来源对象” 和 “目标对象”的地址、精心周到的语句顺序、以及 copy-and-swap。
  • 确定任何函数如果操作一个以上的对象,而其中多个对象是同一个对象时,其行为仍然正确。

“自我赋值”很容易被使用,虽然没有意义,但若不加以 处理会造成系统报错。

  1. 法 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. 法2 拷贝副本,让operator= 具备异常安全性

    widget& widget::operator=( const widget& rhs ){
        Bitmap* pOrig = pb;				// 记住原先的 pb
        pb = new Bitmap( *rhs.pb );		// 令 pb 指向 *pb 的一个副本
        delete pOrig;					// 删除原先的 pb
        return *this;
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值