轉載自: 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