程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 詳解C++語言中的函數對象

詳解C++語言中的函數對象

編輯:C++入門知識

C++語言的世界中有這樣兩個概念,向上類型轉換,向下類型轉換,分別描述的是子類向基類和基類向子類的強制類型轉換,希望對C++語言的描述能給大家帶來一些有用的信息。

一般而言,它是由一個重載了operator()的類所實例化得來的對象。 Function object的涵義比通常意義上的函數更廣泛,因為它可以在多次調用之間保持某種“狀態”——這和靜態局部變量有異曲同工之妙;

不過這種“狀態”還可以被初始化,還可以從外面來檢測,這可要比靜態局部變量強了。雖然傳遞函數指針被廣泛應用於事件驅動系統中,以此實現回調函數通過指針來調用。

  • Vista系統中C++ Builder還這麼好使嗎?
  • 如何進行C++ Builder中的文件讀寫操作
  • 總結C++開發技巧
  • C++編譯器如何對Const常量進行分配存儲空
  • 淺析難以捉摸的C++語言多樣化問題

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. }; 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved