類成員函數指針(member function pointer),是 C++ 語言的一類指針數據類型,用於存儲一個指定類具有給定的形參列表與返回值類型的成員函數的訪問信息。一般我們是不會使用的,都是直接將帶有返回值的函數作為參數或者另存後使用;像函數指針我們只會在定義包含多個函數的結構體類型時使用, ...
類成員函數指針(member function pointer),是 C++ 語言的一類指針數據類型,用於存儲一個指定類具有給定的形參列表與返回值類型的成員函數的訪問信息。一般我們是不會使用的,都是直接將帶有返回值的函數作為參數或者另存後使用;像函數指針我們只會在定義包含多個函數的結構體類型時使用,或者是當帶返回值的函數有多個得時候。當然,由於筆者只是初步涉及函數指針,目前並沒有在實際使用中體會到函數指針得快樂~~悲傷~
我麽先來簡單舉一個函數指針得例子:
#include<iostream>
using namespace std;
void estimate(int lines, double (*pf)(int));
double rick(int lines);
int main(void)
{
int code;
cout << "Enter the money:";
cin >> code;
estimate(code, rick/*計算lines時間的函數*/);
return 0;
}
void estimate(int lines, double (*pf)(int)/*指向執行函數的地址*/)
{
cout << "Lines code will take time:" << (*pf)(lines) << endl;
}
double rick(int lines)
{
return lines*0.05;
}
我們可以很明確得看到,函數指針定義時需要:返回值類型:(double)+函數指針:(*pf)+成員類型:(int);這就是最簡單得使用場景,rick得演算法可以維護者自己定義而不需要修改原本main函數;因為C++得歷史原因,其實這裡使用(*p)(50)與p(50)作用相同,歷史原因我們不深究,C++plus一書中有具體說明,這裡大家知道兩者的意義相同就好了。
緊接著,我們講函數指針的使用高級一下,嘗試定義一個函數指針數組,來看以下代碼:
#include<iostream>
using namespace std;
const double* f1(const double* ar, int number);
const double* f2(const double* ar, int number);
const double* f3(const double* ar, int number);
int main(void)
{
double av[3] = { 11.11,22.22,33.33 };
//定義一個函數指針數組
const double *(* pa[3])(const double*, int) = {f1,f2,f3};
auto pb = pa;//新建一個函數指針的數組,讓編譯器自己進行類型選擇
for (int i = 0; i < 3; i++)
cout << "address:"<< (pa[i])(av, 3) <<" value:" << *(pa[i])(av, 3) << endl;
for (int i = 0; i < 3; i++)
cout << "address:" << (pb[i])(av, 3) << " value:" << *(pb[i])(av, 3) << endl;
return 0;
}
const double *f1(const double* ar, int number)
{
return ar;//返回第一個元素的地址
}
const double* f2(const double* ar, int number)
{
return ar+1;//返回第二個元素的地址
}
const double* f3(const double* ar, int number)
{
return ar + 2;//返回第三個元素的地址
}
我們可以很明確得看到,函數指針定義時需要:返回值類型:(const double*)+函數的指針數組:(*pa)[數組成員數量]+成員類型:(const double*, int);當函數指針數組的數組進行賦值時,如果我們不使用auto而是自己定義,則需要;
const double* (*pb[3])(const double*, int)= {f1, f2, f3};
或者:
const double* (**pb)(const double*, int) = pa;
/*
(**pb) 指向函數的指針數組的指針
(const double*, int) 函數參數類型
const double* 函數返回值類型
*/
以上關於函數指針的基本使用就介紹完畢,我們針對上面的函數指針的定義舉例再說明一下,不要再關註上面的代碼了,請忘記一切,重新理解下麵代碼:
const double* (* pa)(const double*, int);//定義一個函數指針
/*
(*pa) 指針
(const double*, int) 函數的參數類型
const double* 函數返回值類型,註意下函數的返回值是指針類型
*/
const double *(* pa[3])(const double*, int) = {f1,f2,f3};//定義一個 “包含3個函數”的函數指針數組
/*
(* pa[3]) 函數指針數組
(const double*, int) 函數參數類型
const double* 函數返回值類型
*/
還有兩種,就是指向數組指針地址的指針和上面auto提到的指向數組指針的指針:
const double *(* pa[3])(const double*, int) = {f1,f2,f3};//定義一個 “包含3個函數”的函數指針數組
const double *(* (*pd)[3])(const double*, int) = &pa;
/*
(* (*pd)[3]) 指向 (函數的指針數組)的地址 的指針pd--pd=&pa
(const double*, int) 函數參數類型
const double * 函數返回值類型
從* pa[3]函數指針數組的層面看待,因為數組不允許直接賦值,所以必須地址賦值
*/
const double* (**pb)(const double*, int) = pa;
/*
(**pb) 指向 ((函數的指針數組)指針)的指針pb---pb=pa
(const double*, int) 函數參數類型
const double* 函數返回值類型
從pb,pa單純的指針層面看待,是地址間的相互賦值
*/
以上內容如有描述錯誤或者概念不清晰的可以留言討論,畢竟作者關於最後補充的兩種定義只是學習過程中接觸到,實際項目並沒有使用過,相關隱患也請大佬指點~
本文來自博客園,作者:{張一默},轉載請註明原文鏈接:https://www.cnblogs.com/YiMo9929/p/16611450.html