原则10:令operator=返回一个reference to *this 原则11:在operator=中处理“自我赋值”

在这篇博文里面我打算写两个《Effective C++》中的原则,因为第一个原则太短了。
现在介绍第一个原则:条款10,此条款旨在说明在你自己编写的赋值操作符=一定要返回该左值的引用。具体来说就是返回this。这很好解释,因为this是指向本对象的指针,那么this就是该对象的本身实体了。而你现在返回的只不过是该实体的一个代表符号而已。现在一般的赋值操作符都采用这个原则,虽然不是强制的,但是大家都遵守。
下面来对条款11做一些介绍。
条款11的内容很简单,就是一定要妥善处理赋值操作符=的自我赋值问题,就是自己给自己赋值的情况。那么这又是为什么呢?因为在某些时候你要编写用来管理资源的类,那你知道一个资源不用了就要释放掉,以便留给下一个需要该资源的对象。不过,这是很合理的。但是,假设当前占用该资源的对恰好是用来赋值的右值,也就是它俩其实是一个东东。如果还是按照上面处理的话,就会出现被用来赋值的右值实际上已经啥实质内容都没有了,this指针指向了NULL,那就会发生错误。那么怎样处理这种情况呢?
第一种方法很简单,那就是在赋值操作符的实现中最先判断一下赋值的对象和被赋值的对象是不是一个,即if(this==&obj)。不过这种方法不好,因为这需要额外写出一条语句,这无疑会增加运行时间。
所以实际上采用的办法就是所谓的COPY and SWAP方法。什么意思呢?首先赋值一份右值,生成一个COPY,然后用*this与这个COPY进行SWAP,那么就可以完美解决自我赋值的问题。因为既然是COPY那么原来那个右值就没有改变,而this原本是空的,它和那个COPY交换以后,那个COPY就变成了NULL,而this的内容就成了COPY,也就是原来的那个右值的值了。
还有一种方法就是直接利用赋值操作符重载函数的传参机制是传值这一特性,直接传进来一个COPY。该方法可行,但是作者不提倡,它说这样做的话清晰性变差了,我的这个清晰性大概就是可读性吧。不过,我倒觉得没啥。他又说这种方法有时候可能更高效。

你可能感兴趣的:(原则10:令operator=返回一个reference to *this 原则11:在operator=中处理“自我赋值”)