仿函数

来源:互联网 发布:重庆金蝶软件 编辑:程序博客网 时间: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
原创粉丝点击