類成員函式指標(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=&pa
/*
(**pb) 指向函式的指標陣列的指標
(const double*, int) 函式引數型別
const double* 函式回傳值型別
*/
以上關于函式指標的基本使用就介紹完畢,我們針對上面的函式指標的定義舉例再說明一下, please clear your mind,查看下面代碼:
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;//本質就是*=&,需要注意pa是一個陣列,而不是地址!!!!!!
/*
(* (*pd)[3]) 首先*pd是一個指標陣列;其次是一個函式指標
(const double*, int) 函式引數型別
const double * 函式回傳值型別
*/
//第二種:新建一個函式指標陣列
const double* (**pb)(const double*, int) = pa;//本質就是pb=pa,需要注意**pb與*(*pb)結合性的區別
/*
(**pb) 指向 首先,*pb是一個指標;其次采用指標的指標指向pa
(const double*, int) 函式引數型別
const double* 函式回傳值型別
*/
當然,實際使用時我們并不這樣去手擼代碼,而是采用typedef或auto的方法去定義,以上內容如有描述錯誤或者概念不清晰的可以留言討論,切記在C++中我們盡量避免直接去定義這種比較復雜的引數,畢竟C++的設計目的就是讓編程變得簡單,實際專案堅決不可以故意玩此類騷操作,多打注釋~
本文來自博客園,作者:{張一默},轉載請注明原文鏈接:https://www.cnblogs.com/YiMo9929/p/16611450.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/502837.html
標籤:其他
上一篇:AOP面向切面編程簡單介紹
