effective3关于函数对象的理解

来源:互联网 发布:bluebird.js 编辑:程序博客网 时间:2024/06/06 03:14

转自http://blog.csdn.net/huang_xw/article/details/7934156

在C++编程语言中,有很多功能都与C语言相通,比如指针的应用等等。在这里我们介绍的则是一种类似于函数指针的C++函数对象的相关介绍。C++函数对象不是函数指针。但是,在程序代码中,它的调用方式与函数指针一样,后面加个括号就可以了。这是入门级的随笔,说的是函数对象的定义,使用,以及与函数指针,成员函数指针的关系。

C++函数对象实质上是一个实现了operator()--括号操作符--的类
下面是函数对象与函数指针的例子:
[cpp] view plain copy
 print?
  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. }  
除了定义方式不一样,使用方式可是一样的。
既然C++函数对象与函数指针在使用方式上没什么区别,那为什么要用函数对象呢?很简单,函数对象可以携带附加数据,而指针就不行了。下面就举个使用附加数据的例子:
[cpp] view plain copy
 print?
  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   
另一个例子:
[cpp] view plain copy
 print?
  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 的位置  
要想让一个函数既能接受函数指针,也能接受函数对象,最方便的方法就是用模板。如:
[cpp] view plain copy
 print?
  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. }  
这个函数可以统计数组中符合条件的数据个数,如:
[cpp] view plain copy
 print?
  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   

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 发货运单号发错了怎么办 天猫积分为零怎么办 山东聊城小型车脱审一年怎么办? 廉租房如果夫妻离婚怎么办 淘宝客服不给退货怎么办 天猫客服打字慢怎么办 京东买的kindle坏了怎么办 欧巴怎么办韩语怎么写 聚划算淘宝口令打不开怎么办 道聚城白银礼包下架怎么办 聚星输了很多钱怎么办 弹力运动裤被烟烧了个洞怎么办 生完宝宝胯宽怎么办 黑色纯棉裤子洗的发白怎么办 金盾保险柜密码忘了怎么办 装修好的房子漏水怎么办 刚装修的房子墙面开裂怎么办 刚装修的房子有味道怎么办 代销产品规格填写不完整怎么办 我的信息被泄露怎么办 进入不良网站手机发信息怎么办 发不良信息被停机了怎么办 手机qq登录显示被冻结怎么办 qq账户被冻结了怎么办 qq钱包账户被永久冻结怎么办 怎么办转让费还没给我 收钱吗不能抵用红包怎么办 红包抵扣被关了怎么办 天猫客户给差评怎么办 淘宝闪电退款有纠纷怎么办呀 手机屏幕右下角出现彩色点怎么办 在超市买到假货怎么办 天猫超市多发货怎么办 天猫中不小心取消退款了怎么办 天猫超市写错了怎么办 二维码收付款不到红包怎么办 天猫优惠劵过期了怎么办 天猫购物津贴用不完怎么办 天猫上买的大件东西实物不符怎么办 天猫上面料成分与实物不符怎么办 闲鱼发货与实物不符怎么办