effective C++笔记之条款17: 在operator=中检查给自己赋值的情况

l        注意别名:同一个对象有两个以上的名字。别名可以以大量任意形式的伪装出现,所以在写函数时一定要考虑到它。

l        在赋值运算符要特别注意可能出现的别名的情况,有两个理由:

1.        效率。如果可以在赋值运算符函数体的首部检测到是给自己赋值,就可以立即返回,从而可以节省大量的工作,否则必须去实现整个赋值操作。

2.        更重要的原因。一个赋值运算符必须首先释放掉一个对象的资源(去掉旧值),然后根据新值分配新的资源。在自己给自己赋值的情况下,释放旧的资源是灾难性的, 因为在分配新的资源时会需要旧的资源。

l        解决问题的方法是对可能发生的自己给自己赋值的情况先进行检查判断,如果有这种情况就立即返回。

l        判断“相同”的方法(object identity):

1.       值相等

2.       地址相等。容易实现而且计算很快。采用值相等不一定具有这两个优点。

如下所示:

C& C::operator=(const C& rhs)

{

         If(this == &rhs) return *this;

         …

}

l        别名和object identity的问题不仅局限在operator=里。在任何一个用到函数里都可能会遇到。在用到引用和指针的场合,任何两个兼容类型的对象名称都可能指的是同一个对象。

l        所以任何时候写一个函数,只要有别名有可能出现,就必须在写代码时进行处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值