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 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM