不抛出异常的swap
#include<iostream>using namespace std;
/*
1.提供一个public swap成员函数,让它 高效地置换你的 类型 的 两个成员对象 (绝不会抛出异常)
2.在class 或 template 所在 命名空间 内 提供 一个 non-member swap(非成员 函数 的 swap), 并 令它 调用swap 成员函数
3.为正在 编写的 类 class (非 class template),为你的 class 特化std::swap,并 令它 调用swap 成员函数
4.如果你调用swap (例如 :在 dosomething函数 中 调用 swap函数 ),包含一个using 声明式 ,让std::swap在函数内曝光可见
*/
/*
成员版本swap绝不可抛出异常
swap缺省版本 是以 copy构造函数 和 copy assignment操作符 为基础 (一般 两者 都允许 抛出异常)
自定义 swap (1)高效置换对象值 (2)不抛出异常 (1)高效 基于 内置类型的 操作 (例如 pipml 手法的 底层指针) (2)内置类型的 操作 绝不会 抛出异常
*/
namespace WidgetStuff
{template<typename T>class WidgetImp1{};template<typename T>class Widget{public:Widget(){}Widget(const Widget<T>&rhs){}Widget & operator =(const Widget<T> &rhs){*pImp1 = *rhs.pImp1;}void swap(Widget &other){using std::swap;swap(pImp1,other.pImp1);}public:WidgetImp1<T> *pImp1;};/*template <typename T>void swap(Widget<T> &a,Widget<T> &b){a.swap(b);cout<<"WidgetStuff:: void swap(Widget<T> &a,Widget<T> &b)"<<endl;}*/
};
namespace std/*std::模板特化版本*/
{using namespace WidgetStuff;template<>void swap(Widget<int> &a,Widget<int> &b)/*模板的全特化*/{cout<<"std:: void swap(Widget<int> &a,Widget<int> &b)"<<endl;a.swap(b);}
};
template<typename T>
void dosomething(T &obj1,T &obj2)
{using std::swap;/*让std::swap在函数内曝光可见*/swap(obj1,obj2);/*名称查找法则(确保将找到global作用域 或 T所在命名空间内任何T专属的swap*//*如果T是widget 并 位于 命名空间widgetstuff 内 ,编译器会使用“ 实参取决之查找规则” 找出 widgetstuff 内的 swap,如果没有T专属之swap存在,编译器就会使用std内的swap感谢using声明式让std::swap在函数内曝光*/
}int main()
{using namespace WidgetStuff;Widget<int> a;Widget<int> b;swap(a,b);dosomething(a,b);return 0;
}
不抛出异常的swap相关推荐
- 为了异常安全(swap,share_ptr)——Effecive C++
互斥锁: 假设我们要在多线程中实现背景图片的控制: class PrettyMenu{ public:--void changeBackground(std::istream& imgSrc) ...
- 《Effective C++》学习笔记(条款25:考虑写出一个不抛异常的swap函数)
最近开始看<Effective C++>,为了方便以后回顾,特意做了笔记.若本人对书中的知识点理解有误的话,望请指正!!! swap函数是一个非常经典又有用的函数,除了它本身用来交换两个对 ...
- effective c++ 学习
<Effective C++> 目录: 转自:http://blog.csdn.net/KangRoger/article/details/44706403 目录 条款1:视C++为一个语 ...
- Effective C++ --4 设计与声明
上一部分Effective C++ --3 资源管理 18.让接口容易被正确使用,不易被误用 (1)设计接口时要考虑客户可能可能做出的错误输入,如参数的形式等. 19.设计class犹如设计type ...
- 万字长文带你一文读完Effective C++
Effective C++ 视C++为一个语言联邦 STL Template C++ C Object-oriented C++ 一开始C++只是C加上一些面向对象特性,但是随着这个语言的成熟他变得更 ...
- Effective 笔记
1,C++属于一个语言联邦 : C Object-Oriented C++ Template C++ STL 2,应尽量以const,enum,inline替换#defin ...
- C++学习笔记-----operator=函数处理自赋值
很多时候我们需要对类使用赋值运算符operator=函数来将一个类赋值给令一个类,但是如果类的成员变量中存在指针类型的变量,而且这个指针的内存是从heap内存中申请的时候,在实现赋值运算符函数的时候要 ...
- [Effective C++ --029]为“异常安全”而努力是值得的
假设有个class用来表现夹带背景图案的GUI菜单单,这个class用于多线程环境,所以它有个互斥器(mutex)作为并发控制用: 1 class PrettyMenu{ 2 public: 3 .. ...
- C++模板专门化与重载
最近在复习C++有关知识,又重新看<<Effective C++>>,收获颇丰.原来以前看这边书,好多地方都是浅尝辄止.<<Effective C++>> ...
最新文章
- 摄像头YUV图像常见数据格式介绍
- 独家 | 使用深度神经网络在Oculus Quest上进行准确的手部追踪
- 【Flutter】Flutter 项目中使用 Flutter 插件 ( Flutter 插件管理平台 | 搜索 Flutter 插件 | 安装 Flutter 插件 | 使用 Flutter 插件 )
- asp实现注册登录界面_python app (kivy)-与小型数据库连接,实现注册登录操作
- C#委托及事件处理机制浅析
- 给 ListBox 的 DataTemplate 模板中的 元素设置动画
- 使用继承思想,去开发一款组件(element-ui collapse组件为例子)
- Epic Games创始人眼中的虚拟现实
- 技术总结之SpringIOC
- 物流广告收入实现高速增长 国际投行看好京东转型潜力
- 写读后感,获赠陈能技老师亲笔签名书《性能测试诊断分析与优化》中奖名单公布啦!...
- 三线表(带有行横标目)的绘制方法
- C# 反编译修改dll文件
- wifi ap6212驱动移植及调试分析技术笔记
- Struts2通配符和动态方法调用
- AVC、HEVC、VVC帧间预测技术
- redis---sds(简单动态字符串)详解
- photoshop图片显示为索引,解决办法
- ​最适合女生的10个副业(上篇),只要你有执行力,实现财富自由很简单!
- 三、大数据存储——HBase