天天看點

5分鐘搞懂C++函數指針與函數類型

函數指針和函數類型

函數指針指向的是函數而非對象。和其他指針類型一樣,函數指針指向某種特定類型。

函數類型由它的傳回值和參數類型決定,與函數名無關。

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

本文來自雲栖社群合作夥伴“

”,了解相關資訊可以關注“

”。

繼續閱讀