這篇文章把函數(shù)指針的各種常用情況做了一個詳解的總結(jié)。
1. 指向普通函數(shù)的指針
很簡單,,如下的例子可以說明基本格式和用法:
上例中,,int_operator會被編譯器解釋成類型int(*)(int, int)的一個指針。 調(diào)用方式還可以寫作:(*int_operator)(4, 5),,這樣的好處是讓人一眼就能看到int_operator是一個函數(shù)指針,。 注意:函數(shù)指針和指向函數(shù)的返回值的類型和參數(shù)都必須嚴(yán)格一致;
2. 函數(shù)指針數(shù)組
我們還可以聲明一個函數(shù)指針的數(shù)組,,比如: int (*pFuncArray[10])(); []的優(yōu)先級高于*,,該語句將pFuncArray聲明為擁有10個元素的數(shù)組,每一個元素都是指向一個函數(shù)的函數(shù)指針,,該函數(shù)沒有參數(shù),,返回值類型為int;
注意不能寫作:int ((*pFuncArray)[10])(),,這樣會產(chǎn)生編譯錯誤,; (*pFuncArray)[10]表明了pFuncArray是一個指針,該指針指向一個’含有 10個元素的數(shù)組’,; 其類型為int()(),,顯然,編譯不能通過,。
將上面的聲明轉(zhuǎn)換為typedef格式,,會使程序可讀性增加: typedef int(*pFunc)(); pFunc pFuncArray[10]; 如果需要調(diào)用其中的第三個函數(shù),那么調(diào)用方式為:pFuncArray[2]();
3. 指向‘函數(shù)指針數(shù)組’的指針 還可以聲明一個指向‘函數(shù)指針數(shù)組’的指針,,比如下面的例子代碼:
聲明分解說明如下: (*ppCmps):表明ppCmps是一個指針; (*ppCmps)[2]:后面緊跟[2],,表明ppCmps是一個指向‘兩個元素數(shù)組’的指針 PCMP_FUNC表明了該數(shù)組元素的類型,它是指向函數(shù)的指針,,返回值為int,,有兩個const char*類型的參數(shù); 實際上語句PCMP_FUNC (*ppCmps)[2] = &pCmpFuncs; 將會被編譯器解釋為: int (*(*ppCmps)[2])(const char*, const char*) = &pCmpFuncs; 聲明分解: (*ppCmps):表明ppCmps是一個指針; (*ppCmps)[2]:后面緊跟[2],,表明ppCmps是一個指向‘兩個元素數(shù)組’的指針 int (*)(const char*, const char *):表明了該數(shù)組元素的類型,,它是指向函數(shù)的指針,返回值為int,,有兩個const char*類型的參數(shù),;
3. 函數(shù)指針與類
在C++語言中,使用函數(shù)指針可以指向類的一個成員函數(shù)或變量,,雖然這種用法很少能用到,,至少我是沒有用過,不過了解一下還是有點必要的,。 為了支持這類指針,,C++有三個特殊的運算法符:::*,,.->,.*,; 指向成員函數(shù)的指針必須與向其賦值的函數(shù)類型匹配,,這包括:1)參數(shù)的類型和個數(shù);2)返回值類型,;3)它所屬的類型,; 指向成員變量的指針必須與向其賦值的變量類型匹配,這包括:1)變量類型,;2)它所屬的類型,; 成員函數(shù)和變量必須被綁定到一個對象或者指針上,,然后才能得到調(diào)用對象的this指針,,然后才能指向成員變量或函數(shù); 類AClass的成員變量int m_iValue,,其完整類型是:int型的類AClass的成員m_iValue,; 類AClass的成員函數(shù)int Add(int),其完整類型是:返回值為int型,,帶一個int類型參數(shù)的類AClass的成員Add,;
注意:指向類的靜態(tài)變量或靜態(tài)成員函數(shù)的指針和普通成員不同;
3.1 指向類成員變量的指針
有了上面的一些說明,看下面的例子就很容易理解了,; .* 是一個新的操作符,,表明是指向成員操作符的指針(另一個是->*,是指針對象的調(diào)用方式)
3.2 指向類成員函數(shù)的指針
有了上面的一些說明,,看下面的例子就很容易理解了; 下面的例子中,,注意調(diào)用方式:(a.*pAAdd)(5);不能寫作a.*pAAdd(5); 因為操作符()的優(yōu)先級是高于.*的因此,,它將被解釋為a.*(pAAdd(5));顯然這是不被支持的。
3.3 指向類靜態(tài)成員的指針
類的靜態(tài)成員屬于該類的全局對象和函數(shù),,并不需要this指針;因此指向類靜態(tài)成員的指針聲明方式和普通指針相同,。 該類指針和普通指針的聲明和調(diào)用方式完全相同,;唯一的不同就是設(shè)置指向的對象時,仍然需要類信息,,這一點和指向普通成員的指針相同,。 下面的例子可以說明使用方式。
|
|