function 函数对象
为什么使用function类:
绑定器,函数对象, lambda表达式它们只能使用在一条语句中,如何实现复用,把他们的类型留下,这就是function类型的作用
注意点:
- 1.实例化function类型的时候必须用一个函数类型
- 2.通过function调用operator ( )函数的时候,需要根据函数类型传入相应的参数
- 3.使用类的成员方法的时候必须依赖一个对象,所以使用类的成员方法时第一个参数是this指针,因此传入的参数第一个是一个临时对象的地址
看似函数对象干的事情函数指针都可以做,但是函数对象可以保存lambda表达式,绑定器绑定的函数对象,函数指针就办不到。
1.使用普通的全局函数
2.使用类的成员方法
bind 绑定器
C++STL绑定器
C++11绑定器
绑定器最多绑定20个参数
C++STL里面的bind1st和bind2nd只能用于二元函数对象,C++11提供的绑定器功能更加强大。
bind用法1:
bind用法2:参数占位符
bind和function综合使用
function只能接收一个类型,而绑定器可以给函数绑定参数。绑定器只能使用在语句当中,语句完了绑定器就需要重新书写,那么如何把绑定器的类型留下来呢?就需要综合使用bind和function
lambda表达式
lambda表达式可以看作是函数对象的升级版
函数对象的缺点:
仅仅可以使用在泛型算法参数传递的过程中,在具有比较性质或自定义操作的优先级队列里面,自定义类型作为优先级队列里面的元素,而元素的比较方式就需要给它传递一个函数对象,传递函数对象最大的特点就是需要先定义一个类型
,这个类型定义以后就只会使用在优先级队列里面,优先级队列使用完后其他地方就再也用不到了。因此就没有必要需要一个函数对象还得定义一个类型出来,灵活性太差
lambda表达式的使用
function类型和lambda表达式的应用
lambda表达式自定义智能指针删除器
优先级队列自定义比较器
智能指针
解决浅拷贝问题
不带引用计数的智能指针auto_ptr,scoped_ptr,unique_ptr
- auto_ptr:转移资源控制权,只有最后一次引用的智能指针才拥有资源,之前的全部失效,被 C++11 摒弃。
- scoped_ptr:直接禁止了拷贝构造和赋值,每个对象对资源都是独占的。
- unique_ptr:直接禁止了拷贝构造和赋值,但是提供了带右值引用参数版本的拷贝构造和赋值,即可以使用移动拷贝和移动构造。
带引用计数的智能指针shared ptr、weak_ptr
- shared_ptr:提出了引用计数的概念,可使得多个智能指针共享同一资源,只有当引用计数为 0 时,才去释放资源。
- weak_ptr:它的提出主要是辅助 shared_ptr,它本身不拥有资源,但是可以监视资源,防止 shared_ptr 的交叉引用问题。
shared_ptr和weak_ptr都是线程安全的,都可以使用在多线程环境下
智能指针的交叉引用(循环引用)问题
多线程访问共享对象问题
多线程访问共享对象的安全问题就可以使用到强弱智能指针,因为shared_ptr可以在线程中检测资源的引用计数来侦测资源是否存活。
自定义删除器
为什么需要给智能指针定义删除器?
因为智能指针的作用是能够保证资源绝对的释放,而智能指针默认的释放方式是delete ptr.而当智能指针托管的资源是数组时,释放资源时就需要加[ ] ,当智能指针管理的不是一块内存的资源,而是一个文件,释放文件的方式绝对不是通过delete来实现的,因此通过智能指针管理资源需要能够释放相应的资源,如何给智能指针自定义删除器来指导智能指针正确的释放资源,这就是删除器的作用。