仿函数
来源:互联网 发布:重庆金蝶软件 编辑:程序博客网 时间:2024/05/01 23:50
仿函数
如果在类中重载了运算符(),那么就一定可以使这个类的对象的外观和行为都类似一个函数,这种类的对象叫作仿函数,也叫做函数对象
class Add{public: int operator()(int x, int y) { return x + y; }};void fuction(int x, int y, Add add){ cout << add(x, y) << endl;}int _tmain(int argc, _TCHAR* argv[]){ cout<<Add()(5,6)<<endl; Add a; cout<<a(5, 6)<<endl; //后面这两个是一样的效果,Add()可以看作是一个临时函数对象 fuction(10, 10, Add()); fuction(10, 10, a); return 0;}
lambda表达式
[捕获参数列表] (参数列表)->返回值类型{程序代码}(形参列表)
比如要取得和上述重载运算符一样的效果可以这么写
[](int x, int y){cout << x + y << endl; }(5, 6);
优点易读,缺点只能在一处使用,复用性差
变量捕获的方式:
[]不捕获
[=]值传递方式捕获全部可捕获变量,不能修改变量的值,相当于加了const
[&]引用方式捕获全部可捕捉变量,可以修改变量的值
[a,b,c]值传递捕获a,b,c
[&a,&b,&c]引用传递捕获a,b,c
[=,&a]引用捕获a,其余的值传递捕获
[this]捕获this指针
使用mutable关键字可以使得值传递的值能够改变,但只限于函数内,外部的值不变
int _tmain(int argc, _TCHAR* argv[]){ int max = 10; [max]()mutable{ max = 11; cout << max << endl; }(); cout << max << endl;//输出分别为11和10 return 0;}
智能指针
把与原始指针有关的操作封装成一个类,并在创建对象时调用构造函数,在对象销毁时自动调用析构函数,在这两个函数中分别完成资源的分配和释放,避免了在使用中对指针释放不正确产生的问题
需要重载*和->运算符
template<typename T>class SharePtr;template<typename T>class Res_Ptr{private: T* res_p; int use_num; friend class SharePtr<T>;public: Res_Ptr(T *p) :res_p(p), use_num(1){ cout << "Res_Ptr构造函数" << endl; } ~Res_Ptr(){ delete res_p; cout << "Res_Ptr析构函数" << endl; }};template<typename T>class SharePtr{public: SharePtr(T *p, T i) :ptr(new Res_Ptr<T>(p)), val(i) { cout << "SharePtr的构造函数" << endl; cout << "use_num=" << ptr->use_num << endl; } SharePtr(const SharePtr & r) { ptr = r.ptr; val = r.val; ptr->use_num++; } ~SharePtr() { cout << "SharePtr析构函数" << endl; if (--ptr->use_num == 0) delete ptr; }private: Res_Ptr<T> *ptr; T val;};int _tmain(int argc, _TCHAR* argv[]){ { SharePtr<int> hqa=SharePtr<int>(new int(42), 100); } return 0;}
c++11支持的智能指针:
1、unique_ptr
独享资源,别人无法占有它的资源,除非被删除或释放
2、shared_ptr
可以多个指针共享同一个资源,中间封装了计数器,可以通过成员函数use_count()查看
3、weak_ptr
为了配合shared_ptr工作而设计的,它的存在不影响shared_ptr的计数器
0 0
- 仿函数
- 仿函数
- 仿函数
- 仿函数
- 仿函数
- 仿函数
- 仿函数
- 仿函数
- 仿函数
- 仿函数
- 仿函数
- 仿函数
- 仿函数
- 仿函数
- 仿函数
- 仿函数
- 仿函数
- 仿函数
- think in java 浅谈 SerialNumberChecker+ SimpleMicroBenchmark+SynchronizationComparisons
- 程序员面试金典2——魔术索引2
- 只用位运算实现整数的加减乘除运算
- 数据结构之有序链表归并算法2
- hacking 麦步手表之(2)命令行编译工程
- 仿函数
- java中10大常见异常
- 补作业 第六次实验 项目3
- Stories 15-18
- Shell高级编程学习笔记(基础篇)
- popupWindows实现安卓底部选项弹窗并完成点击事件。
- Django日志可视化大作战
- Oracle 数据库基础知识总结
- 树-根据前序、中序遍历求后续遍历