您的位置:首页 > 编程语言 > C语言/C++

Effective C++学习笔记 (11)

2012-09-08 17:32 169 查看
本人学习C++不精,故重新学习,点滴记录与大家分享,不足之处还望大牛多多指教



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

         该条款首先提出了有可能出现自我赋值的情况,同时提出了几种可能存在的潜在自我赋值,然后通过解释了自我赋值可能出现的问题,以及如何解决“自我赋值”以及“异常安全性”这两类问题。

         首先看一下以下的代码



这样运用赋值运算符没任何问题,在赋值运算符中先释放自己的m_np,然后在构造一份和item一样的,但是如果改成自我赋值呢?



很容易看出来先把自己的m_np释放了,然后又去取值,导致访问一个非法内存,所以自我赋值需要小心。所以该条款提醒我们在实现复制运算符时需要考虑到自我赋值的情况,对其特殊处理。



很简单的判断,但是仔细考虑下如果在new的时候出现异常,怎么办?比如new失败,那样一来该对象内部就存在一个非法指针,这是不允许的。所以考虑修改下代码实现顺序,可以有所改进。



大家可能发现这个代码实现的确实不够优美,effectiveC++提供了一种copy and swap技术,先构造一个对象,然后再将该对象与this互换,但是我觉得在swap的时候也有可能出现一些问题,当然这些问题在条款12里有所讲述。Copy and swap代码不多,这里就不再写了。总之在写赋值运算符时需要多想想一些特殊的情况。确保该函数对任何一个对象它的结果都没问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ c