函數指針和函數對象
阿新 • • 發佈:2018-02-05
但是 賦值 clas add 一個 port 2.4 blog pause
函數對象:這裏已經說明了這是一個對象,而且實際上只是這個對象具有函數的某些功能,我們才稱之為函數對象,如何使對象具有函數功能呢,很簡單,只需要為這個對象的操作符()進行重載就可以了,如下:
函數指針
從指針的層次上理解函數——函數的函數名實際上就是一個指針,函數名指向該函數的代碼在內存中的首地址。
void bar(char ch, int i) { cout << "bar " << ch << ‘ ‘ << i << endl; }
void (*pBar)(char,int); //定義一個指針變量 pBar=bar; //指針變量賦值 (*pBar)(‘H‘,3); //或者pBar(‘H‘,3);使用typedef更加方便 形式1:typedef 返回類型(*新類型)(參數表)
typedef void(*PFT)(char,int); //定義了一種PFT的類型,並定義這種類型為指向某種函數的指針 PFT pft=bar; //定義指針變量pft並賦值 pft(‘H‘,3);
使用函數指針作為函數參數
void foo(char ch,int i,PFT pf) { pf(ch,i); }
PFT pft = bar; //定義函數指針變量 foo(‘H‘, 91, pft);函數對象 從一般的函數回調意義上來說,函數對象和函數指針是相同的,但是函數對象卻具有許多函數指針不具有的特點,函數對象使程序設計更加靈活,而且能夠實現函數的內聯(inline)調用,使整個程序實現性能加速。
class A{ public: int operator()(int x){return x;} }; A a; a(5);
使用函數對象作為函數參數
可以在函數形參列表中調用函數對象,它完全可以取代函數指針! 當我們想在形參列表中調用某個函數時,可以先聲明一個具有這種函數功能的函數對象,然後在形參中使用這個對象,他所作的功能和函數指針所作的功能是相同的,而且更加安全。1 class FuncView Code2 { 3 public: 4 int operator()(int a, int b) 5 { 6 int res = a + b; 7 cout << a << "+" << b << "="<<res<< endl; 8 return res; 9 } 10 }; 11 int addFunc(int a, int b, Func& func) 12 { 13 return func(a, b); 14 } 15 int main() 16 { 17 Func func; 18 int res = addFunc(2, 3, func); 19 cout << res << endl; 20 system("pause"); 21 return 0; 22 }
使用模板
1 class FuncT 2 { 3 public: 4 template <typename T> 5 T operator()(T a, T b) 6 { 7 T res = a + b; 8 cout << a << "+" << b << "=" << res << endl; 9 return res; 10 } 11 }; 12 template <typename T> 13 T addFuncT(T t1, T t2, FuncT& funct) 14 { 15 return funct(t1, t2); 16 } 17 int main() 18 { 19 FuncT funct; 20 addFuncT<double>(2.4, 3.67, funct); 21 system("pause"); 22 return 0; 23 }View Code
函數指針和函數對象