重載函數調用操作符的類,其對象常稱為函數對象(function object),即它們是行為類似函數的對象,也叫仿函數(functor),其實就是重載“()”操作符,使得類對象可以像函數那樣調用。
注意:1.函數對象(仿函數)是一個類,不是一個函數。2.函數對象(仿函數)重載了”() ”操作符使得它可以像函數一樣調用。
假定某個類有一個重載的 operator(),而且重載的 operator()要求獲取一個參數,我們就將這個類稱為“一元仿函數”(unary functor);相反,如果重載的 operator()要求獲取兩個參數,就將這個類稱為“二元仿函數”(binary functor)。
#include <iostream> #include <vector> #include <algorithm> using namespace std; class FuncObject01 { public: void operator()() { cout << "Hello WOrld!" << endl; } }; void FuncObject02() { cout << "Hello WOrld!" << endl; } void test01() { FuncObject01 fobj; fobj(); FuncObject02(); cout << "------------" << endl; } class FuncObject03 { public: int operator()(int a, int b) { return a + b; } }; int FuncObject04(int a, int b) { return a + b; } // 函數對象也可以像普通函數一樣 具有返回值和參數 void test02() { FuncObject03 fobj; int ret = fobj(10, 20); cout << "ret = " << ret << endl; ret = FuncObject04(10, 30); cout << "ret = " << ret << endl; cout << "------------------------" << endl; } // 函數對象超出了普通函數的功能,可以具有保存函數調用狀態 // 例如 我們要統計函數的調用次數 class FuncObject05 { public: FuncObject05() : count(0) {} void operator()() { cout << "Hello World!" << endl; count++; } int count; }; // 普通函數統計調用次數,需要一個全局變量 int g_count = 0; void FuncObject06() { cout << "Hello World!" << endl; g_count++; } void test03() { FuncObject06(); FuncObject06(); cout << "函數調用次數:" << g_count << endl; // 使用函數對象不需要使用全局變量 FuncObject05 fobj; fobj(); fobj(); fobj(); cout << "函數調用次數:" << fobj.count << endl; cout << "---------------------------" << endl; } // 函數對象做參數和返回值 class print { public: print() : count(0){} void operator()(const int& val) { cout << val << " "; count++; } int count; }; int num = 0; void print2(int val) { cout << val << " "; num++; } void test04() { vector<int> v; v.push_back(1); v.push_back(3); v.push_back(5); v.push_back(2); // 通過for_each算法 遍歷容器元素 print myprint; // 函數對象做返回值和參數 myprint = for_each(v.begin(), v.end(), myprint); cout << endl; cout << "函數調用次數:" << myprint.count << endl; for_each(v.begin(), v.end(), print2); cout << endl; cout << "函數調用次數:" << num << endl; } int main() { test01(); test02(); test03(); test04(); getchar(); return 0; }