C++中函數指針使用

来源:https://www.cnblogs.com/YiMo9929/archive/2022/08/21/16611450.html
-Advertisement-
Play Games

類成員函數指針(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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Oracle序列學習與使用總結 by:授客 QQ:1033553122 簡述 序列是oracle提供的用於生成一系列數字的資料庫對象,序列會自動生成順序遞增的序列號,可用於提供唯一的自動遞增主鍵。序列和視圖一樣,並不占用實際的存儲空間,只是在數據字典中保存他的定義信息。 創建序列 當創建序列時必須擁 ...
  • 概述 由一個或多個 Sentinel(哨兵)實例組成的 Sentinel 系統可以監視任意多個主伺服器,以及這些主伺服器屬下的所有從伺服器,併在被監視的主伺服器進入下線狀態時,自動將下線主伺服器屬下的某個從伺服器升級為新的主伺服器 簡單來說,哨兵就是帶有自動故障轉移功能的主從架構 搭建哨兵架構 以 ...
  • 4 運算符 4.1 算術運算符 4.1.1 概述 JavaScript 提供的算術運算符如下所示: | 類型 | 符號 | 示例| | | | | |加法運算符| + | a+b | |減法運算符| - | a-b | |乘法運算符| * | a*b | |除法運算符| / | a/b | |餘數運 ...
  • CSS transition 屬性詳解 點擊打開視頻講解更詳細 定義和用法 transition 屬性是一個簡寫屬性,用於設置四個過渡屬性: transition-property 規定設置過渡效果的 CSS 屬性的名稱。 transition-duration 規定完成過渡效果需要多少秒或毫秒。 ...
  • 6. layui大事件項目 文件位置:1.Node.js零基礎入門教程\node.js—資料\day8\素材\大事件項目 在assets/js/baseAPI.js中修改統一請求根路徑 6.1 調整介面名稱 純粹是因為之前本人手賤,故意修改名稱與埠所致的。 在assets/js/login.js中 ...
  • 什麼是HTML 點擊打開視頻講解更加詳細 Hyper Text Markup Language(超文本標記語言) 標簽控制排版 體積小,方便傳輸 編寫HTLML 推薦使用:VS Code <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...
  • 迴圈列印紅綠燈 點擊打開視頻講解更加詳細 紅燈3秒後變成綠燈 綠燈5秒後變成黃燈 黃燈2秒後變成紅燈 案例: <template> <div id="app"> <div>迴圈列印紅綠燈</div> <div>紅燈3秒後變成綠燈</div> <div>綠燈5秒後變成黃燈</div> <div>黃燈2 ...
  • 在『伺服器部署 Vue 和 Django 項目的全記錄』一文中,介紹了在伺服器中使用 Nginx 部署前後端項目的過程。然而,當 Web 應用流量增多時,需要考慮負載均衡、流量分發、容災等情況,原生的部署方式通常難以滿足需求。此時,引入 Docker 部署多節點,能夠在單台高性能伺服器或伺服器集群中... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...