1. 程式人生 > >函數指針和函數對象

函數指針和函數對象

但是 賦值 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 Func
2 { 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 }
View Code

使用模板

技術分享圖片
 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

函數指針和函數對象