STL学习笔记8 -- 函数对象

  重载函数调用操作符的类,其对象常称为函数对象(function object),即它们是行为类似函数的对象。一个类对象,表现出一个函数的特征,就是通过“对象名+(参数列表)”的方式使用一个类对象,如果没有上下文,完全可以把它看作一个函数对待。这是通过重载类的operator()来实现的。

  函数对象更重要的作用是实现函数回调,可以替代指针实现函数回调。

定义如下:

struct int_max
{
    int operator()(int x,int y)
    {
        return x>y?x:y;
    }
};

  调用时生成一个对象:

    int_max int_max1;
    cout<<int_max1(3,6)<<endl;

  其中int_max1(3,6)的调用不是函数形式,而是int_max1.operator()(3,6);

  通常函数对象中不定义构造函数和析构函数,因此在这创建和销毁过程中不会出现任何问题。

  而且还可以通过模板实现多样性。

  类声明如下:

class T_max
{
public:
    template <class T>
    T operator()(T x,T y)
    {
        return x>y?x:y;
    }
};

  函数定义如下:

template <class T>
void max_test(T a,T b,T_max &ma)
{
    cout<<ma(a,b)<<endl;
}

  使用如下:

    T_max max1;
    cout<<max1(3,6)<<endl;
    max_test(12,77,T_max());//这里也可以使用临时对象

  函数对象的使用,比指针安全多了,以后函数回调时可使用其替代函数指针。

posted @ 2013-09-28 10:38  struggle_time  阅读(691)  评论(0编辑  收藏  举报