C++函数对象与函数指针不同之处

在C++编程语言中,有很多功能都与C语言相通,比如指针的应用等等。在这里我们介绍的则是一种类似于函数指针的C++函数对象的相关介绍。C++函数对象不是函数指针。但是,在程序代码中,它的调用方式与函数指针一样,后面加个括号就可以了。这是入门级的随笔,说的是函数对象的定义,使用,以及与函数指针,成员函数指针的关系。
C++函数对象实质上是一个实现了operator()--括号操作符--的类
下面是函数对象与函数指针的例子:
  1. namespace  
  2. {  
  3.     class AddCls  
  4.     {    
  5.     public:    
  6.         int operator()(int a, int b)    
  7.         {    
  8.             return a + b;    
  9.         }    
  10.     };  
  11.   
  12.     int AddFunc(int a, int b)    
  13.     {    
  14.         return a + b;    
  15.     }  
  16. }  
  17.   
  18. void test_addObj()  
  19. {  
  20.     // 定义函数对象   
  21.     AddCls addObj;   
  22.     PRINT_DEBUG(addObj(3, 4);  
  23. }  
  24.   
  25. void test_addFunPtr()  
  26. {  
  27.     typedef int (*FunPtr) (int a, int b);    
  28.     FunPtr addFunPtr = &AddFunc;  
  29.     PRINT_DEBUG(addFunPtr(3, 5));  
  30. }  
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++函数对象与函数指针在使用方式上没什么区别,那为什么要用函数对象呢?很简单, 函数对象可以携带附加数据,而指针就不行了。下面就举个使用附加数据的例子:
  1. class less    
  2. {    
  3. public:    
  4.     less(int num):n(num){}    
  5.     bool operator()(int value)    
  6.     {   
  7.         return value < n;    
  8.     }    
  9. private:    
  10.     int n;    
  11. };  
  12. less isLess(10);  
  13. cout << isLess(9) << " " << isLess(12); // 输出 1 0   
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 
另一个例子:
  1. const int SIZE = 5;    
  2. int array[SIZE] = { 50, 30, 9, 7, 20};    
  3. // 找到小于数组array中小于10的第一个数的位置     
  4. int * pa = std::find_if(array, array + SIZE, less(10));  
  5. // pa 指向 9 的位置     
  6. // 找到小于数组array中小于40的第一个数的位置     
  7. int * pb = std::find_if(array, array + SIZE, less(40));   
  8. // pb 指向 30 的位置  
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 的位置
要想让一个函数既能接受函数指针,也能接受函数对象,最方便的方法就是用模板。如:
  1. template<typename FUNC>  
  2. int count_n(int* array, int size, FUNC func)    
  3. {    
  4.   int count = 0;    
  5.   for(int i = 0; i < size; ++i)    
  6.   if(func(array[i]))    
  7.     count ++;    
  8.   return count;    
  9. }  
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;  
}
这个函数可以统计数组中符合条件的数据个数,如:
  1. const int SIZE = 5;    
  2. int array[SIZE] = { 50, 30, 9, 7, 20};    
  3. cout << count_n(array, SIZE, less(10)); // 2     
  4. // 用函数指针也没有问题:     
  5. bool less10(int v)    
  6. {    
  7.   return v < 10;    
  8. }    
  9. cout << count_n(array, SIZE, less10); // 2   
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 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值