函数对象

一、函数对象的概念

重载函数调用操作符的类,其对象常称为函数对象(function object),即它们是行为类似函数的对象,也叫仿函数(functor),其实就是重载“()”操作符,使得类对象可以像函数那样调用。

注意:

1、函数对象(仿函数)是一个类,不是一个函数。

2、函数对象(仿函数)重载了“()”操作符使得它可以像函数一样调用。

假定某个类有一个重载的operator(),而且重载的operator()要求获取一个参数,我们就将这个类称为“一元仿函数(unary function)”;相反,如果重载的operator()要求获取两个参数,我们就将这个类称为“二元仿函数(binary function)”

二、案例:计算函数调用次数

方法一:

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
//#include <algorithm>
using namespace std;

struct MyPrint
{
    void operator()(int val)
    {
        cout << val << endl;
    }
};

int num = 0;//真正在开发中,尽量避免去使用全局变量
void MyPrint02(int val)
{
    num++;
    cout << val << endl;
}

void test01()
{
    MyPrint print;
    print(10);//10

    //函数对象可以像普通函数一样调用
    //函数对象可以像普通函数那样接收参数
    //函数对象超出了函数的概念,函数对象可以保存函数调用的状态
}

void test02()
{
    //计算函数调用次数
    MyPrint02(10);//10
    MyPrint02(20);//20
    MyPrint02(30);//30
    MyPrint02(40);//40
    cout << "print调用次数:" << num << endl;//print调用次数:4
}
int main(void)
{
    //test01();
    test02();
    return 0;
}

方法二:

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

struct MyPrint
{
    MyPrint()
    {
        mNum = 0;
    }
    void operator()(int val)
    {
        mNum++;
        cout << val << endl;
    }
public:
    int mNum;
};

void test01()
{
    MyPrint print;
    print(10);//10
              //函数对象可以像普通函数一样调用
              //函数对象可以像普通函数那样接收参数
              //函数对象超出了函数的概念,函数对象可以保存函数调用的状态
}

void test02()
{
    vector<int> v;
    v.push_back(10);
    v.push_back(20);
    v.push_back(30);
    v.push_back(40);

    //计算函数调用次数
    MyPrint print;
    MyPrint print02 = for_each(v.begin(), v.end(), print);//for_each返回值为print的类型,即MyPrint
                                                          //10
                                                          //20
                                                          //30
                                                          //40
    cout << "print调用次数:" << print.mNum << endl;//0
    cout << "print调用次数:" << print02.mNum << endl;//4
}
int main(void)
{
    //test01();
    test02();
    return 0;
}

 

posted @ 2018-12-13 18:14  悦悦的小屋  阅读(288)  评论(0编辑  收藏  举报