函數(shù)指針和函數(shù)類型
- 函數(shù)指針指向的是函數(shù)而非對象。和其他指針類型一樣乍构,函數(shù)指針指向某種特定類型甜无。
- 函數(shù)類型由它的返回值和參數(shù)類型決定,與函數(shù)名無關哥遮。
bool length_compare(const string &, const string &);
上述函數(shù)類型是:bool (const string &, const string &)
;
上述函數(shù)指針pf:bool (*pf)(const string &, const string &)
;
使用函數(shù)指針
- 當把函數(shù)名作為一個值使用時毫蚓,該函數(shù)自動的轉換成指針,如:
pf = length_compare <=>等價于pf = &length_compare
函數(shù)指針形參
函數(shù)類型不能定義為形參昔善,但是形參可以是指向函數(shù)的指針元潘;
-
函數(shù)作為實參使用時,會自動的轉換成函數(shù)指針君仆;
typedef bool Func(const string &, const string &) // Func是函數(shù)類型翩概; typedef bool (*FuncP)(const string &, const string &) // FuncP是函數(shù)指針類型;
typedef decltype(length_compare) Func2 // Func2是函數(shù)類型返咱; typedef decltype(length_compare) *Func2P // Func2是函數(shù)指針類型钥庇;
注意decltype(length_compare)返回的是函數(shù)類型,而不是函數(shù)指針類型咖摹;
using FTtype = int(int,int); //函數(shù)類型
typedef int (*pf)(int, int); //函數(shù)指針
int func(int a, int b){return a+b;}
void print(int a, int b, FTtype fn){
// 編譯器將其隱式轉化成函數(shù)指針
cout << fn(a,b) << endl;
}
int main()
{
print(1,2,func);
cout << typeid(FTtype).name() << endl; // FiiiE
cout << typeid(func).name() << endl; // FiiiE
cout << typeid(decltype(func)).name() << endl; // FiiiE
cout << typeid(pf).name() << endl; // PFiiiE
return 0;
}
- 下面兩個聲明語句是同一個函數(shù)评姨,因為編譯器會自動的將FTtype 轉換成函數(shù)指針類型。
void print(int a, int b, FTtype fn); void print(int a, int b, pf fn);
返回指向函數(shù)的指針
雖然不能返回一個函數(shù)萤晴,但是能返回執(zhí)行函數(shù)類型的指針吐句。和函數(shù)參數(shù)不同,編譯器不會自動地將函數(shù)返回類型當作指針類型處理店读,必須顯示的將返回類型指定為指針嗦枢。如:
using F = int(int*, int);
using PF = int(*)(int*,int);
F f1(int); //錯誤: F是函數(shù)類型
PF f1(int); //正確: PF是函數(shù)指針類型
f1也可以寫出下面兩種形式:
int (*f1(int))(int*, int);
auto f1(int)->int(*)(int*, int);