龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > C/C++开发 >

详解C++语言中的函数对象

时间:2011-04-12 23:18来源:未知 作者:admin 点击:
分享到:
在 C++语言 的世界中有这样两个概念,向上类型转换,向下类型转换,分别描述的是子类向基类和基类向子类的强制类型转换,希望对 C++语言 的描述能给大家带来一些有用的信息。 一般

C++语言的世界中有这样两个概念,向上类型转换,向下类型转换,分别描述的是子类向基类和基类向子类的强制类型转换,希望对C++语言的描述能给大家带来一些有用的信息。

一般而言,它是由一个重载了operator()的类所实例化得来的对象。 Function object的涵义比通常意义上的函数更广泛,因为它可以在多次调用之间保持某种“状态”――这和静态局部变量有异曲同工之妙;

不过这种“状态”还可以被初始化,还可以从外面来检测,这可要比静态局部变量强了。虽然传递函数指针被广泛应用于事件驱动系统中,以此实现回调函数通过指针来调用。

C++语言还是提供了另外一种可供选择的办法,即函数对象,利用它可以避免使用函数指针。这样做有几个优点。首先, 因为对象可以在内部修改而不用改动外部接口,因此设计更灵活,更富有弹性。

函数对象也具备有存储先前调用结果的数据成员。此外,编译器可以内联函数对象,从而进一步增强性能。函数对象可以具体表达依赖成员模板的通用算法 , 这些算法借助普通的函数指针难以完成。写个小示例:

  1. #include "stdafx.h"   
  2.  
  3.     
  4.  
  5. #include <iostream>   
  6.  
  7. #include <functional>   
  8.  
  9.     
  10.  
  11. using namespace std;   
  12.  
  13.     
  14.  
  15. class Action;   
  16.  
  17. class Drink;   
  18.  
  19. class Eat;   
  20.  
  21. class TestAction;   
  22.  
  23.     
  24.  
  25. class Action   
  26.  
  27. {   
  28.  
  29. public:      
  30.  
  31.        int operator()(int i)   
  32.  
  33.        {   
  34.  
  35.               Act(i);   
  36.  
  37.               return i;   
  38.  
  39.        }   
  40.  
  41.     
  42.  
  43.        virtual void Act(int i) = 0;   
  44.  
  45. };   
  46.  
  47.     
  48.  
  49. class Drink : public Action   
  50.  
  51. {   
  52.  
  53.        void Act(int i)   
  54.  
  55.        {   
  56.  
  57.               cout<<"No. "<<i<<" drink..."<<endl;   
  58.  
  59.        }   
  60.  
  61. };   
  62.  
  63.     
  64.  
  65. class Eat : public Action   
  66.  
  67. {   
  68.  
  69.        void Act(int i)   
  70.  
  71.        {   
  72.  
  73.               cout<<"No. "<<i<<" eat..."<<endl;   
  74.  
  75.        }       
  76.  
  77. };   
  78.  
  79.     
  80.  
  81. class TestAction   
  82.  
  83. {   
  84.  
  85. public:   
  86.  
  87.        void TestAct(int i, Action& testAct)   
  88.  
  89.        {       
  90.  
  91.               testAct(i);   
  92.  
  93.        }   
  94.  
  95. }; 
精彩图集

赞助商链接