天天看點

C++的函數對象優于函數指針地方

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

繼續閱讀