函数对象
一、函数对象的概念
重载函数调用操作符的类,其对象常称为函数对象(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; }