仿函数

仿函数

如果在类中重载了运算符(),那么就一定可以使这个类的对象的外观和行为都类似一个函数,这种类的对象叫作仿函数,也叫做函数对象

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<5,6)<cout<5, 6)<//后面这两个是一样的效果,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;
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(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 *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的计数器

你可能感兴趣的:(学习笔记,STL)