轉載自:http://blog.csdn.net/huang_xw/article/details/7934156
在C++編程語言中,有很多功能都與C語言相通,比如指針的應用等等。在這里我們介紹的則是一種類似於函數指針的C++函數對象的相關介紹。C++函數對象不是函數指針。但是,在程序代碼中,它的調用方式與函數指針一樣,后面加個括號就可以了。這是入門級的隨筆,說的是函數對象的定義,使用,以及與函數指針,成員函數指針的關系。
C++函數對象實質上是一個實現了operator()--括號操作符--的類。
下面是函數對象與函數指針的例子:
namespace { class AddCls { public: int operator()(int a, int b) { return a + b; } }; int AddFunc(int a, int b) { return a + b; } } void test_addObj() { // 定義函數對象 AddCls addObj; PRINT_DEBUG(addObj(3, 4); } void test_addFunPtr() { typedef int (*FunPtr) (int a, int b); FunPtr addFunPtr = &AddFunc; PRINT_DEBUG(addFunPtr(3, 5)); }
除了定義方式不一樣,使用方式可是一樣的。
既然C++函數對象與函數指針在使用方式上沒什么區別,那為什么要用函數對象呢?很簡單,函數對象可以攜帶附加數據,而指針就不行了。下面就舉個使用附加數據的例子:
class less { public: less(int num):n(num){} bool operator()(int value) { return value < n; } private: int n; }; less isLess(10); cout << isLess(9) << " " << isLess(12); // 輸出 1 0
另一個例子:
const int SIZE = 5; int array[SIZE] = { 50, 30, 9, 7, 20}; // 找到小於數組array中小於10的第一個數的位置 int * pa = std::find_if(array, array + SIZE, less(10)); // pa 指向 9 的位置 // 找到小於數組array中小於40的第一個數的位置 int * pb = std::find_if(array, array + SIZE, less(40)); // pb 指向 30 的位置
要想讓一個函數既能接受函數指針,也能接受函數對象,最方便的方法就是用模板。如:
template<typename FUNC> int count_n(int* array, int size, FUNC func) { int count = 0; for(int i = 0; i < size; ++i) if(func(array[i])) count ++; return count; }
這個函數可以統計數組中符合條件的數據個數,如:
const int SIZE = 5; int array[SIZE] = { 50, 30, 9, 7, 20}; cout << count_n(array, SIZE, less(10)); // 2 // 用函數指針也沒有問題: bool less10(int v) { return v < 10; } cout << count_n(array, SIZE, less10); // 2