c++學習之初話 函數指針和函數對象 的因緣
函數指針可以方便我們調用函數,但采用函數對象,更能體現c++面向對象的程序特性。
函數對象的本質:()運算符的重載。我們通過一段代碼來感受函數指針和函數對象的使用:
1 int AddFunc(int a, int b) 2 { 3 return a + b; 4 } 5 6 class Add 7 { 8 public: 9 const int operator()(const int a,const int b) 10 { 11 return a+b; 12 } 13 }; 14 15 int main()16 { 17 //函數指針 18 int (*Add1)(int a,int b); 19 int (*Add2)(int a,int b); 20 Add1 = &AddFunc; 21 Add2 = AddFunc;//兩種函數指針賦初值方法 22 cout << (*Add1)(3,2)<<endl; // 5 23 cout<<Add1(3,2)<<endl;//輸出可以加*,也可以不加 24 25 //函數對象 26 Add addFunction; 27 cout<<addFunction(2,3)<<endl;//調用類的重載操作符()方法 28 system("pause"); 29 return 0; 30 }
我們可以看到:函數AddFunc和類Add本質上都是實現了對a+b的加法運算。從功能上講,兩者並無區別,但從設計上講,兩者的區別很大,一個將功能封裝成函數,一個封裝成類。
我們再來關註兩種方式下的調用過程:
1 函數指針:
我們使用函數指針的目的在於:使用指針的方式來調用函數。
可能我們之前使用使用指針的場合過少,以至於使得我們忘了指針的強大(我們可以將指針指向任意一種類型,無論是基礎類型,還是派生類型,只要指針定義的合理)。既然要使用指針調用函數,首先需要聲明一個函數指針(這就如同你要想將一個指針指向整型數據,要先聲明一個int*指針),聲明了函數指針之後,將該指針指向我們要調用的函數(這就是第20行和21行做的事),函數指針指向了我們要調用的函數,就可以用函數指針來調用函數了(22行的代碼)。因此,不管是函數指針還是其他指針,指針的基本使用思想是一致的
1 定義 和所要指向對象類型相同(這裏是函數)的指針(指向對象是什麽類型,自己就是什麽類型的指針)
2 將指針指向調用對象
3 使用指針的方式代替對象本身執行相應功能。
2 函數對象
我們使用函數指針的目的在於:使用對象(真正意義上的c++中的對象)的方式來調用函數(是不是和上面很類似)。
假如我們先不考慮運算符重載這個層面的東西,僅僅是考慮上層的東西,來思考其中的函數對象的運作機制:
首先,我們將所要執行的功能封裝成了一個類(這個類本質上實現了()運算符的重載),因為我們封裝成了類,所以我們可以聲明對象;因為這個類本質上實現了函數運算符()的重載,所以我們將這個對象稱之為函數對象。也就是,首先,我們基於c++的基本思想(萬物皆可對象),將函數封裝成了類,然後用該類聲明對象,則該對象就是函數對象,使用這個函數對象,我們可以完成函數的調用。 我們來看看函數獨享的基本使用過程是:
1 定義 和所要“指向”類型相同(這裏是類)的(函數)對象
2 使用函數對象的方式執行相應的功能
我們可以發現:函數對象的使用更加簡潔,也更加符合c++的程序設計思想!
(ps:附上c++後臺開發技能樹)
c++學習之初話 函數指針和函數對象 的因緣