---恢復內容開始---
函數指針指向的是函數而非對象,和其他指針一樣,函數指針指向某種特定類型,函數的類型由它的返回類型和形參類型共同決定,與函數名無關。
bool LengthCompare(const string &,const string &)
該函數的類型是bool(const string& ,const string&)。想要聲明一個指向改函數的指針,只需要用指針特換函數名即可:
bool (*pf)(const string&, const string&);//未初始化
賦值我們可以通過兩種方法賦值:
pf=LengthCompare;
pf=&LengthCompare;
我們還可以直接使用指向函數的指針調用函數,無須提前解引用:
bool b1=pf("hello","goodbye"); bool b2=(*pf)("hello","goodbye"); bool b3=LengthCompare("hello","goodbye"); //三個等價調用
指向不同函數類型的指針之間不存在轉換。
重載函數指針
使用重載函數時,上下文必須清晰地定界到底選用了哪個函數,如果定義了指向重載函數的指針.
函數指針形參
雖然不能定義函數類型的形參,但是形參可以是指向函數的指針。此時,形參看起來是函數類型,實際上確實當成指針使用:
1 //第三個形參是函數類型,它會自動地轉成指向函數類型的指針 2 void useBigger(const string &s1,const string &s2,bool pf(const string &,const string&)); 3 //等價 4 void useBigger(const string &s1,const string &s2,bool (*pf)(const string&,const string&)); 5 6 useBigger(s1,s2,lengthCompare);
正如uesBigger函數的聲明所示,直接使用函數指針類型顯得冗長而復雜,類型別名和decltype能讓我們簡化使用了函數指針的代碼
1 typedef bool(*FuncP)(const string&,const string &);
2 typedef decltype(lengthCompare) *FuncP2;
1 void useBigger(const string &,const string&,Func); 2 void useBigger(const string &,const string&,FuncP2);
返回指向函數的指針
using F=int(int*,int)//F是函數類型 using PF=int*(int*,int)//F是指針類型 F f1*(int) //顯式的指定返回類型是指向函數的指針 PF f1(int) //PF是指向函數的指針,f1返回指向函數的指針 //直接聲明f1: int (* f1(int) ) (int*,int) //C++ 11新特性 auto f1(int)->int*(int*,int)
將auto和decltype用於函數指針類型
-
如果我們明確知道返回的函數的哪一個就能使用該方法。 string::size_type sumLength(const string&,const string&); decltype(sunLength) *getFcn(const string&);
當我們將decltype作用於某個函數是,它返回函數類型而非指針類型。