1. 程式人生 > >cpp: 使用typedef定義函式指標

cpp: 使用typedef定義函式指標

  • Java在對於oop的封裝上面抽象程度非常的高;但是對於函式,java裡面的函式或者方法,可以說是非常基礎或者低階。縱觀java的語言特性,沒有對函式有更高程度的封裝。
  • 但是,除了在oop方面的抽象,在函式方面,也可以有很高程度的抽象。這一點,在javascript / python / c /c++上面就有所體現。

如果之前沒有接觸過對於函式的抽象,那麼第一次接觸會覺得比較難以理解。比如c++中的函式指標的概念,函式指標陣列,指向函式指標的陣列等,都是不好理解的。

還好c++中提供了自定義型別的方式,也就是typedef。通過typedef,可以把複雜的型別進行封裝,以便於理解和使用。

對於typedef函式指標用法

,推薦看這篇部落格,講解的非常清楚到位。甚至比《C++ Primer Plus》上面講解的更清楚透徹。

下面我也來給出我的理解和使用示例:

#include <iostream>

/*
char (*pFun)(int);

char glFun(int a) { ; }

int main() {
    pFun = glFun;
    (*pFun)(2);
    return 0;
}*/


int (*pAdd)(int, int); // 定義函式指標 pAdd , pAdd不是一個函式,而是函式指標

typedef int (*pFunAdd)(int, int); // 定義一個新的型別
// pFunAdd 到底是什麼型別呢?是一個函式指標型別, // 其中被指向的函式是引數為2個int,返回型別為int的函式. int add(int x, int y); int sum(int x, int y); void useArr(pFunAdd arr[], int size); /** * 定義一個新的型別,如同int,char一樣,型別名:pFuncUseArr */ typedef void (*pFunUseArr)(pFunAdd *arr, int size); // define a type int main() { using namespace std
; pAdd = add; int zz = (*pAdd)(3, 4); cout << "zz=" << zz << endl; cout << "# # # # # # # # # # # # " << endl; pFunAdd funAdd = add; int q = funAdd(5, 6); cout << "q =" << q << endl; cout << "函式指標陣列:" << endl; pFunAdd arr[3] = {add, add, sum}; useArr(arr, 3); cout << "函式指標-- " << endl; pFunUseArr pfu = useArr; pfu(arr+1, 2); return 0; } void useArr(pFunAdd arr[], int size) { int a = 3; int b = 4; using namespace std; for (int i = 0; i < size; ++i) { pFunAdd pf = arr[i]; cout << "i=" << i << " , pf=" << pf << ":\t" << pf(a, b) << endl; } } int add(int x, int y) { return x + y; } int sum(int x, int y) { return x * x + y * y; }

輸出如下:

zz=7
# # # # # # # # # # # # 
q =11
函式指標陣列:
i=0 , pf=1: 7
i=1 , pf=1: 7
i=2 , pf=1: 25
函式指標-- 
i=0 , pf=1: 7
i=1 , pf=1: 25

Process finished with exit code 0

可以看到如果要定義一個對應函式為int add(int,int);的函式指標的方式為:typedef int (*pFunAdd)(int, int);,通過這樣一個型別定義,就定義了一個函式指標,然後就可以如同int,char一樣去使用了。

pFunAdd funAdd = add; // 定義一個 pFunAdd 型別的變數 funAdd ,並賦值為 add. 
//(add是一個函式名,也就是一個函式指標)
int q = funAdd(5, 6); // 如同使用add 一樣去使用 funAdd 就好了。

以上,就是使用typedef去定義函式指標的方式。~