函数对象的概念
重载函数调用操作符的类,其对象称为函数对象(function object),即他们是行为类似函数的对象,也叫仿函数(functor),其实就是重载“()”操作符,使类对象可以向函数那样调用。
- 函数对象(仿函数)是一个类,不是一个函数。
- 函数对象(仿函数)重载了“()”操作符使他可以像函数一样调用。
假定某个类有一个重载的operator(),而且重载的operator()要求获取一个参数,我们称这个类为”一元仿函数“;相反,如果重载的operator()要求获取两个参数,就称这个类为”二元仿函数“。
- 函数对象可以像普通函数一样调用。
- 函数对象可以像普通函数那样接收参数。
- 函数对象超出了函数的概念,函数对象可以保存函数调用的状态。
例一:
class MyPrint //仿函数
{
public:
void operator()(int val) {
cout << val << endl;
}
};
void test01() {
MyPrint print;
print(10);//调用仿函数
}
例二:
class MyPrint //仿函数
{
public:
void operator()(int val) {
cout << val << endl;
}
};
void test02() {
MyPrint print;
vector<int> v = { 10,20,30,40 };
for_each(v.begin(), v.end(), print);
}
例三:统计print调用次数
for_each具有返回值。
class MyPrint //仿函数
{
public:
MyPrint() {
sum = 0;
}
void operator()(int val) {
sum++;
cout << val << endl;
}
int sum;
};
void test02() {
MyPrint print;
vector<int> v = { 10,20,30,40 };
MyPrint mp=for_each(v.begin(), v.end(), print);//接收for_each返回值
cout << "print调用次数:" << mp.sum << endl;
}
例四:
void MyPrint01(int val) {
cout << val << endl;
}
void test02() {
MyPrint print;
vector<int> v = { 10,20,30,40 };
for_each(v.begin(), v.end(), MyPrint01);
}