Effective C++学习笔记 (11)
2012-09-08 17:32
169 查看
本人学习C++不精,故重新学习,点滴记录与大家分享,不足之处还望大牛多多指教
。
首先看一下以下的代码
这样运用赋值运算符没任何问题,在赋值运算符中先释放自己的m_np,然后在构造一份和item一样的,但是如果改成自我赋值呢?
很容易看出来先把自己的m_np释放了,然后又去取值,导致访问一个非法内存,所以自我赋值需要小心。所以该条款提醒我们在实现复制运算符时需要考虑到自我赋值的情况,对其特殊处理。
很简单的判断,但是仔细考虑下如果在new的时候出现异常,怎么办?比如new失败,那样一来该对象内部就存在一个非法指针,这是不允许的。所以考虑修改下代码实现顺序,可以有所改进。
大家可能发现这个代码实现的确实不够优美,effectiveC++提供了一种copy and swap技术,先构造一个对象,然后再将该对象与this互换,但是我觉得在swap的时候也有可能出现一些问题,当然这些问题在条款12里有所讲述。Copy and swap代码不多,这里就不再写了。总之在写赋值运算符时需要多想想一些特殊的情况。确保该函数对任何一个对象它的结果都没问题。
。
在operator=中处理“自我赋值”
该条款首先提出了有可能出现自我赋值的情况,同时提出了几种可能存在的潜在自我赋值,然后通过解释了自我赋值可能出现的问题,以及如何解决“自我赋值”以及“异常安全性”这两类问题。首先看一下以下的代码
这样运用赋值运算符没任何问题,在赋值运算符中先释放自己的m_np,然后在构造一份和item一样的,但是如果改成自我赋值呢?
很容易看出来先把自己的m_np释放了,然后又去取值,导致访问一个非法内存,所以自我赋值需要小心。所以该条款提醒我们在实现复制运算符时需要考虑到自我赋值的情况,对其特殊处理。
很简单的判断,但是仔细考虑下如果在new的时候出现异常,怎么办?比如new失败,那样一来该对象内部就存在一个非法指针,这是不允许的。所以考虑修改下代码实现顺序,可以有所改进。
大家可能发现这个代码实现的确实不够优美,effectiveC++提供了一种copy and swap技术,先构造一个对象,然后再将该对象与this互换,但是我觉得在swap的时候也有可能出现一些问题,当然这些问题在条款12里有所讲述。Copy and swap代码不多,这里就不再写了。总之在写赋值运算符时需要多想想一些特殊的情况。确保该函数对任何一个对象它的结果都没问题。
相关文章推荐
- Effective c++学习笔记——条款11:在operateor=中自我赋值
- Effective c++学习笔记——条款11:在operateor=中自我赋值
- Effective C++学习笔记 第三弹 11-18
- MySQL学习笔记_11_Linux下C++/C连接MySQL数据库(一)
- 传智播客Spring视频教程学习笔记11
- 算法导论学习笔记(11)——贪心算法之哈夫曼树
- 莫烦 python Pandas 学习笔记 2017.12.7.11
- springmvc学习笔记(11)——SessionAttributes
- C++ Primer 学习笔记_11_指针
- live555学习笔记11-h264 RTP传输详解(3)
- [置顶] 高效effective C++ 55条款之个人学习笔记二
- Practical Rendering and Computation with Direct3D 11学习笔记(2.1.2)
- 2013斯坦福大学iOS应用开发学习笔记 11 Table View and iPad
- IOS学习笔记11—IOS通知中心
- Effective C++学习笔记(Part One:Item 1-4)
- Java学习笔记12:求s=1+11+111+1111+......+1111......1的值
- Effective C++学习笔记之对RAII思想的思考
- Effective C++学习笔记之“尽量使用初始化而不要在构造函数里赋值”
- [C++学习] effective c++ 笔记 pass by value ,pass by reference
- AndrewNg神经网络和深度学习笔记-Week2-11向量化