C++函数指针使用总结
一 函數(shù)指針介紹
函數(shù)指針指向某種特定類型,函數(shù)的類型由其參數(shù)及返回類型共同決定,與函數(shù)名無關(guān)。舉例如下:
int add(int nLeft,int nRight);//函數(shù)定義該函數(shù)類型為int(int,int),要想聲明一個指向該類函數(shù)的指針,只需用指針替換函數(shù)名即可:
int (*pf)(int,int);//未初始化則pf可指向int(int,int)類型的函數(shù)。pf前面有*,說明pf是指針,右側(cè)是形參列表,表示pf指向的是函數(shù),左側(cè)為int,說明pf指向的函數(shù)返回值為int。則pf可指向int(int,int)類型的函數(shù)。而add類型為
int(int,int),則pf可指向add函數(shù)。 pf = add;//通過賦值使得函數(shù)指針指向某具體函數(shù)注意:*pf兩端的括號必不可少,否則若為如下定義:
int *pf(int,int);//此時pf是一個返回值為int*的函數(shù),而非函數(shù)指針二 標準C函數(shù)指針
1 函數(shù)指針的定義
1.1 普通函數(shù)指針定義
int (*pf)(int,int);1.2 使用typedef定義函數(shù)指針類型
typedef int (*PF)(int,int); PF pf; //此時,為指向某種類型函數(shù)的函數(shù)指針類型,而不是具體指針,用它可定義具體指針2 函數(shù)指針的普通使用
pf = add; pf(100,100);//與其指向的函數(shù)用法無異 (*pf)(100,100);//此處*pf兩端括號必不可少 注意:add類型必須與pf可指向的函數(shù)類型完全匹配3 函數(shù)指針作為形參
//第二個形參為函數(shù)類型,會自動轉(zhuǎn)換為指向此類函數(shù)的指針 Void fuc(int nValue,int pf(int,int)); //等價的聲明,顯示的將形參定義為指向函數(shù)的指針 Void fuc(int nValue,int (*pf)(int,int)); Void fuc(int nValue,PF);形參中有函數(shù)指針的函數(shù)調(diào)用,以fuc為例:
pf = add;//pf是函數(shù)指針 fuc(1,add);//add自動轉(zhuǎn)換為函數(shù)指針 fuc(1,pf);4返回指向函數(shù)的指針
4.1 使用typedef定義的函數(shù)指針類型作為返回參數(shù)
PF fuc2(int);//PF為函數(shù)指針類型4.2 直接定義函數(shù)指針作為返回參數(shù)
int (*fuc2(int))(int,int);//顯示定義說明:按照有內(nèi)向外的順序閱讀此聲明語句。fuc2有形參列表,則fuc2是一個函數(shù),其形參為fuc2(int),fuc2前面有*,所以fuc2返回一個指針,指針本身也包含形參列表(int,int),因此指針指向函數(shù),該函數(shù)的返回值為int.
總結(jié):fuc2是一個函數(shù),形參為(int),返回一個指向int(int,int)的函數(shù)指針。
二 C++函數(shù)指針
1由于C++完全兼容C,則C中可用的函數(shù)指針用法皆可用于C++
2 C++其他函數(shù)(指針)定義方式及使用
2.1 typedef與decltype組合定義函數(shù)類型
typedef decltype(add) add2;decltype返回函數(shù)類型,add2是與add相同類型的函數(shù),不同的是add2是類型,而非具體函數(shù)。
使用方法:
add2* pf;//pf指向add類型的函數(shù)指針,未初始化2.2 typedef與decltype組合定義函數(shù)指針類型
typedef decltype(add)* PF2;//PF2與1.1PF意義相同 PF2 pf;// pf指向int(int,int)類型的函數(shù)指針,未初始化2.3 使用推斷類型關(guān)鍵字auto定義函數(shù)類型和函數(shù)指針
auto pf = add;//pf可認為是add的別名(個人理解) auto *pf = add;//pf為指向add的指針3 函數(shù)指針形參
typedef decltype(add) add2; typedef decltype(add)* PF2; void fuc2 (add2 add);//函數(shù)類型形參,調(diào)用自動轉(zhuǎn)換為函數(shù)指針 void fuc2 (PF2 add);//函數(shù)指針類型形參,傳入對應(yīng)函數(shù)(指針)即可說明:不論形參聲明的是函數(shù)類型:void fuc2 (add2 add);還是函數(shù)指針類型void fuc2 (PF2 add);都可作為函數(shù)指針形參聲明,在參數(shù)傳入時,若傳入函數(shù)名,則將其自動轉(zhuǎn)換為函數(shù)指針。
4 返回指向函數(shù)的指針
4.1 使用auto關(guān)鍵字
auto fuc2(int)-> int(*)(int,int) //fuc2返回函數(shù)指針為int(*)(int,int)4.2 使用decltype關(guān)鍵字
decltype(add)* fuc2(int)//明確知道返回哪個函數(shù),可用decltype關(guān)鍵字推斷其函數(shù)類型,5 成員函數(shù)指針
5.1普通成員函數(shù)指針使用舉例
class A//定義類A { private: int add(int nLeft, int nRight) { return (nLeft + nRight); } public: void fuc() { printf("Hello world\n"); } }; typedef void(A::*PF1)();//指針名前需加上類名限定 PF1 pf1 = &A::fuc; //必須有& A a;//成員函數(shù)地址解引用必須附駐與某個對象地址,所以必須創(chuàng)建一個隊形 (a.*pf1)();//使用成員函數(shù)指針調(diào)用函數(shù)5.2 繼承中的函數(shù)指針使用舉例
class A { public: void fuc() { printf("Hello fuc()\n"); } void fuc2() { printf("Hello A::fuc2()\n"); } }; class B:public A { public: virtual void fuc2() { printf("Hello B::fuc2()\n"); } }; typedef void(A::*PF1)(); typedef void(B::*PF2)(); PF1 pf1 = &A::fuc; int main() { A a; B b; (a.*pf1)(); //調(diào)用A::fuc (b.*pf1)(); //調(diào)用A::fuc pf1 = &A::fuc2; (a.*pf1)(); //調(diào)用A::fuc2 (b.*pf1)(); //調(diào)用A::fuc2 PF2 pf2 = &A::fuc2; (b.*pf2)(); //調(diào)用A::fuc2 }6重載函數(shù)的指針
6.1 重載函數(shù)fuc
Void fuc(); Void fuc(int);6.2 重載函數(shù)的函數(shù)指針
void (*PF)(int) = fuc;//PF指向fuc(int) int(*pf2)(int) = fuc;//錯誤沒有匹配的類型注意:編譯器通過指針類型決定選取那個函數(shù),指針類型必須與重載函數(shù)中的一個精確匹配。
轉(zhuǎn)載自:https://www.cnblogs.com/lvchaoshun/p/7806248.html
總結(jié)
以上是生活随笔為你收集整理的C++函数指针使用总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 生成高斯热力图(craft中有使用)+2
- 下一篇: Java特性之多态的理解