如果在类中重载了运算符(),那么就一定可以使这个类的对象的外观和行为都类似一个函数,这种类的对象叫作仿函数,也叫做函数对象
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; }[捕获参数列表] (参数列表)->返回值类型{程序代码}(形参列表)
比如要取得和上述重载运算符一样的效果可以这么写
[](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的计数器