函数对象
重载函数调用操作符的类,其对象称为函数对象(functio object),即它们是行为类似函数的对象,也叫仿函数(functor),其实就是重载“()”操作符,使得类对象可以像函数那样调用。
注意:
1、函数对象(仿函数)是一个类的实例化对象,不是一个函数。
2、函数对象(仿函数)重载了”() ”操作符使得它可以像函数一样调用。
作用:
1、函数对象超出了普通函数的概念,可以保存函数的调用状态。
1 #include <iostream> 2 using namespace std; 3 4 //函数对象超出了普通函数的概念,可以保存函数的调用状态 5 class MyPrint 6 { 7 public: 8 MyPrint() : printCount(0){} 9 void operator()(int val) 10 { 11 printCount++; 12 cout << val << endl; 13 } 14 public: 15 int printCount; 16 }; 17 18 void test() 19 { 20 MyPrint print;//函数对象 21 for (int i = 0; i < 5; ++i) 22 print(i); 23 cout << "打印次数:" << print.printCount << endl; 24 } 25 26 int main(void) 27 { 28 test(); 29 return 0; 30 }
2、函数对象有类型的概念,可以做参数和返回值。
1 #include <iostream> 2 using namespace std; 3 4 //函数对象可以做参数和返回值 5 class MyPrint 6 { 7 public: 8 MyPrint() : printCount(0){} 9 void operator()(int val) 10 { 11 printCount++; 12 cout << val << endl; 13 } 14 public: 15 int printCount; 16 }; 17 18 void DoBusiness(MyPrint &print,int i) 19 { 20 print(i); 21 } 22 23 void test() 24 { 25 MyPrint print;//函数对象 26 for (int i = 0; i < 5; ++i) 27 DoBusiness(print, i);//把函数对象当做实参 28 cout << "打印次数:" << print.printCount << endl; 29 } 30 31 int main(void) 32 { 33 test(); 34 return 0; 35 }
3、在C++STL算法中,需要传入函数对象。
1 #include <iostream> 2 #include <vector> 3 #include <algorithm> 4 #include <functional> 5 using namespace std; 6 7 void test(void) 8 { 9 vector<int> v; 10 v.push_back(10); 11 v.push_back(70); 12 v.push_back(50); 13 v.push_back(20); 14 15 //sort默认按照从小到大排序 16 sort(v.begin(), v.end()); 17 for_each(v.begin(), v.end(), [](int val)->void{cout << val << " "; }); 18 cout << endl; 19 //greater<int>(),为一个匿名的函数对象,让sort按照从大到小排序 20 sort(v.begin(), v.end(), greater<int>()); 21 for_each(v.begin(), v.end(), [](int val)->void{cout << val << " "; }); 22 cout << endl; 23 } 24 25 int main(void) 26 { 27 test(); 28 return 0; 29 }