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 所以任何时候写一个函数,只要有别名有可能出现,就必须在写代码时进行处理。