1. 程式人生 > >c++學習之初話 函數指針和函數對象 的因緣

c++學習之初話 函數指針和函數對象 的因緣

調用函數 函數的調用 urn use 什麽 派生類 技能 color 本質

函數指針可以方便我們調用函數,但采用函數對象,更能體現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++學習之初話 函數指針和函數對象 的因緣