effective c++ 条款11 Handle assignment to self in operator=
赋值给自己,听起来有些不可思议,但是却要引起重视,它很容易把自己隐藏起来。
例如
1 a[i]=a[j];
如果 i, j的值一样?
2 *px=*py;
如果px py指向同一个object
3 rb and pd migh also be a same object.
class Base
{
...
};
class Derived : public Base
{
...
};
void doSomething(const Base& rb, Derived *pd);
以上表明多种自我赋值的可能性。
那么在自我赋值时会出现哪些问题呢?
class Bitmap{};
class Widget
{
private:
Bitmap* pb; // point to a mem from heap
} Widget Widget::&operator=(const Widget & rhs)
{
delete pb;
pb = new Bitmap(*rhs.pb);
return *this;
}
表面看上述代码没有问题,但是如果自我赋值就会有问题。
1 自己指向的bitmap先被删除了。
2 另外这也可能导致异常安全性的问题。如果new的Bitmap没有成功,就会有一个指向未知地址的指针,无法删除而且无法读取。
我们先focus在问题1上面,问题2会在第29章详细讨论。
一个可行的做法
Widget Widget::&operator=(const Widget & rhs)
{
if(this == &rhs) return *this;//identity test; delete pb;
pb = new Bitmap(*rhs.pb);
return *this;
}
这会导致代码增大和降低执行速度(增加的代码,引入控制分支)
另外一个可行的办法是使用所谓的copy and swap技术
Widget Widget::&operator=(const Widget & rhs)
{
Widget tmp(rhs);
swap(tmp); // swap *this and tmp
return *this;
}
effective c++ 条款11 Handle assignment to self in operator=的更多相关文章
- effective c++ 条款10 handle assignment to self operator =
非强制性,但是个好习惯 当使用连锁赋值时很有用 x=y=z=10; class Window { public: Window& operator=(int size) { ... retur ...
- Effective C++ Item 10,11 Have assignment operators return a reference to *this Handle assignment to self in operator =
If you want to concatenate assignment like this int x, y, z; x = y = z = 15; The convention is to ma ...
- Effective C++ 条款11:在operator=中处理"自我赋值"
"自我赋值"发生在对象被赋值给自己时: class Widget { ... }; Widget w; ... w = w; // 赋值给自己 a[i] = a[j]; // 潜在 ...
- Effective C++ 条款11,12 在operator= 中处理“自我赋值” || 复制对象时不要忘记每一个成分
1.潜在的自我赋值 a[i] = a[j]; *px = *py; 当两个对象来自同一个继承体系时,他们甚至不需要声明为相同类型就可能造成别名. 现在担心的问题是:假如指向同一个对象, ...
- Effective C++ -----条款11: 在operator=中处理“自我赋值”
确保当对象自我赋值时operator=有良好行为.其中技术包括比较“来源 对象”和“目标对象”的地址.精心周到的语句顺序.以及copy-and-swap. 确定任何函数如果操作一个以上的对象,而其中多 ...
- Effective C++ 条款11
在operator=中处理"自我赋值" 什么是自我赋值,非常明显. 就是自己的值赋值给了自己.以下的代码就是自我赋值: class Widget { public: Widget& ...
- 《Effective C++ 》学习笔记——条款11
***************************************转载请注明出处:http://blog.csdn.net/lttree************************** ...
- effective C++ 读书笔记 条款11
条款11: 在operator= 中处理"自我赋值" 在实现operator=时考虑自我赋值是必要的就像 x=y .我们不知道变量x与y代表的值是否为同一个值(把x和y说成是一个指 ...
- [More Effective C++]条款22有关返回值优化的验证结果
(这里的验证结果是针对返回值优化的,其实和条款22本身所说的,考虑以操作符复合形式(op=)取代其独身形式(op),关系不大.书生注) 在[More Effective C++]条款22的最后,在返回 ...
随机推荐
- GitLab 5.3 升级注意事项
最主要就是需要更新的Git.我的Ubuntu12.04通过apt-get install安装的git版本过低. 所以只能通过源代码安装. 参考下面的步骤: wget git-core.googleco ...
- [Cocos2d-x]随机数
Cocos2d-x为我们提供了生成随机数的宏:CCRANDOM_0_1() 具体定义如下: /** @def CCRANDOM_0_1 returns a random float between 0 ...
- aix 下 实现goldengate 随os启动而自己主动启动的脚本
aix 下 实现goldengate 随os启动而自己主动启动的脚本: 1.用oracle用户建立/u01/info.txt,文件内容例如以下: sh date start mgr 2.chmod + ...
- Android_app项目开发步骤总结
做了几个android企业应用项目后,总结了项目的基本开发步骤.希望可以交流. 一 应用规划: ※确定功能. ※必须的界面及界面跳转的流程. ※须要的数据及数据的来源及格 ...
- configure: error: zlib not installed
export LDFLAGS="-L/usr/local/zlib/lib" export CPPFLAGS="-I/usr/local/zlib/include&quo ...
- ORA-12520错误解决一则
问题描写叙述: 今天突然发现连接数据库时报错,用pl/sql dev连接数据时,有时能连接上,有时连接时报: ORA-12520: TNS: 监听程序无法找到须要的server类型的可用句柄 通过se ...
- STP学习总结
STP学习总结 STP是广泛应用在二层的具有冗余的网络中用来消除环路的一种机制,当然二层环网中用来消除环路的技术还有RRPP和H3C的smart-link技术等. 一.STP的一些基本概念 STP是I ...
- SEAndroid安全机制中的进程安全上下文关联分析
前面一篇文章分析了文件安全上下文关联过程.可是在SEAndroid中,除了要给文件关联安全上下文外,还须要给进程关联安全上下文.由于仅仅有当进程和文件都关联安全上下文之后,SEAndroid安全策略才 ...
- Mac下配置Cocos2d-x3.1环境
一.前期准备 1.ADT:百度下就OK 2.NDK:百度下就OK 3.ANT: http://124.254.47.39/download/55152992/78533365/4/zip/57/132 ...
- Jedis Client的使用以及序列化
JedisPool pool = new JedisPool(poolConfig, IP, PORT, timeout); public String set(String key,String v ...