函數指針


---恢復內容開始---

函數指針指向的是函數而非對象,和其他指針一樣,函數指針指向某種特定類型,函數的類型由它的返回類型和形參類型共同決定,與函數名無關。

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用於函數指針類型

  1. 如果我們明確知道返回的函數的哪一個就能使用該方法。
    
    string::size_type sumLength(const string&,const string&);
    
    decltype(sunLength) *getFcn(const string&);

     當我們將decltype作用於某個函數是,它返回函數類型而非指針類型。 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM