函數指針和函數類型
函數指針指向的是函數而非對象。和其他指針類型一樣,函數指針指向某種特定類型。
函數類型由它的傳回值和參數類型決定,與函數名無關。
bool length_compare(const string &, const string &);
上述函數類型是:
bool (const string &, const string &);
上述函數指針pf:
bool (*pf)(const string &, const string &);
使用函數指針
當把函數名作為一個值使用時,該函數自動的轉換成指針,如:
pf = length_compare <=>等價于
pf = &length_compare12
函數指針形參
函數類型不能定義為形參,但是形參可以是指向函數的指針;
函數作為實參使用時,會自動的轉換成函數指針;
typedef bool Func(const string &, const string &) // Func是函數類型;
typedef bool (*FuncP)(const string &, const string &) // FuncP是函數指針類型;
typedef decltype(length_compare) Func2 // Func2是函數類型;
typedef decltype(length_compare) *Func2P // Func2P是函數指針類型;
注意decltype(length_compare)傳回的是函數類型,而不是函數指針類型;
using FTtype = int(int,int); //函數類型
typedef int (*pf)(int, int); //函數指針
int func(int a, int b){return a+b;}
void print(int a, int b, FTtype fn){
// 編譯器将其隐式轉化成函數指針
cout << fn(a,b) << endl;
}
int main()
{
print(1,2,func);
cout << typeid(FTtype).name() << endl;
cout << typeid(func).name() << endl;
cout << typeid(decltype(func)).name() << endl;
cout << typeid(pf).name() << endl;
return 0;
}
下面兩個聲明語句是同一個函數,因為編譯器會自動的将FTtype 轉換成函數指針類型。
void print(int a, int b, FTtype fn);
void print(int a, int b, pf fn);
傳回指向函數的指針
雖然不能傳回一個函數,但是能傳回執行函數類型的指針。和函數參數不同,編譯器不會自動地将函數傳回類型當作指針類型處理,必須顯示的将傳回類型指定為指針。如:
using F = int(int*, int);
using PF = int(*)(int*,int);
F f1(int); //錯誤: F是函數類型
PF f1(int); //正确: PF是函數指針類型
f1也可以寫出下面兩種形式:
int (*f1(int))(int*, int);
auto f1(int)->int(*)(int*, int);
作者:guoxiaojie_415
來源:https://blog.csdn.net/guoxiaojie_415/article/details/79921788
原文釋出時間為:2018-09-30
原文作者:
良許Linux本文來自雲栖社群合作夥伴“
”,了解相關資訊可以關注“
”。