在C++編程語言中,有很多功能都與C語言相通,比如指針的應(yīng)用等等。在這里我們介紹的則是一種類似于函數(shù)指針的C++函數(shù)對象的相關(guān)介紹。C++函數(shù)對象不是函數(shù)指針。但是,在程序代碼中,它的調(diào)用方式與函數(shù)指針一樣,后面加個括號就可以了。這是入門級的隨筆,說的是函數(shù)對象的定義,使用,以及與函數(shù)指針,成員函數(shù)指針的關(guān)系。
C++函數(shù)對象實質(zhì)上是一個實現(xiàn)了operator()--括號操作符--的類。
下面是函數(shù)對象與函數(shù)指針的例子:
- 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()
- {
- // 定義函數(shù)對象
- 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++函數(shù)對象與函數(shù)指針在使用方式上沒什么區(qū)別,那為什么要用函數(shù)對象呢?很簡單,函數(shù)對象可以攜帶附加數(shù)據(jù),而指針就不行了。下面就舉個使用附加數(shù)據(jù)的例子:
- 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};
- // 找到小于數(shù)組array中小于10的第一個數(shù)的位置
- int * pa = std::find_if(array, array + SIZE, less(10));
- // pa 指向 9 的位置
- // 找到小于數(shù)組array中小于40的第一個數(shù)的位置
- int * pb = std::find_if(array, array + SIZE, less(40));
- // pb 指向 30 的位置
要想讓一個函數(shù)既能接受函數(shù)指針,也能接受函數(shù)對象,最方便的方法就是用模板。如:
- 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;
- }
這個函數(shù)可以統(tǒng)計數(shù)組中符合條件的數(shù)據(jù)個數(shù),如:
- const int SIZE = 5;
- int array[SIZE] = { 50, 30, 9, 7, 20};
- cout << count_n(array, SIZE, less(10)); // 2
- // 用函數(shù)指針也沒有問題:
- bool less10(int v)
- {
- return v < 10;
- }
- cout << count_n(array, SIZE, less10); // 2
|