c++函數(shù)指針使用示例分享
需求
假設(shè)要設(shè)計(jì)一個(gè)名為estimate()的函數(shù),估算編寫指定行數(shù)的代碼所需的時(shí)間,并且希望不同的程序員都可以使用該函數(shù)。
對于所有的用戶來說,estimate()中一部分代碼都是相同的,但該函數(shù)允許每個(gè)程序員提供自己的算法來估算時(shí)間。
為實(shí)現(xiàn)目標(biāo),采用的機(jī)制是,將程序員要使用的算法函數(shù)的地址傳遞給estimate()。
實(shí)現(xiàn)代碼如下
// funpointer.cpp : 定義控制臺(tái)應(yīng)用程序的入口點(diǎn)。
//
#include "stdafx.h"
#include <iostream>double betsy(int);
double pam(int);
//estimate函數(shù)的第二個(gè)參數(shù)接受一個(gè)函數(shù)指針
void estimate(int lines,double (*pf)(int));
int _tmain(int argc, _TCHAR* argv[])
{
using namespace std;
int code;
cout<<"How many lines of code do you need?"<<endl;
cin>>code;
cout<<"Here's Betsy's estimate:"<<endl;
estimate(code,betsy);
cout<<"Here's Pam's estimate:"<<endl;
estimate(code,pam);
getchar();
getchar();
return 0;
}
inline double betsy(int lines){return 0.05*lines;}
inline double pam(int lines){return 0.03*lines+0.004*lines*lines;}
inline void estimate(int lines,double (*pf)(int))
{
using namespace std;
cout<<lines<<" lines will take "<<(*pf)(lines)<<"hour(s)"<<endl;
}
運(yùn)行結(jié)果
使用函數(shù)指針的好處
以上設(shè)計(jì)有助于今后的程序開發(fā)。當(dāng)某個(gè)程序員為估算時(shí)間開發(fā)自己的算法時(shí),他將不需要重新編寫estimate()函數(shù)。相反,他只需要提供自己的函數(shù)地址,并保證該函數(shù)的參數(shù)和返回類型正確即可。
函數(shù)指針使得程序員可以修改estimate()的行為,雖然他接觸不到estimate()的源代碼。
內(nèi)聯(lián)函數(shù)
由于函數(shù)實(shí)現(xiàn)的功能較簡單,所以可以使用內(nèi)聯(lián)函數(shù)來代替常規(guī)函數(shù)。
要使用內(nèi)聯(lián)函數(shù)(C++的新特性,用于提高程序運(yùn)行速度),必須采取下述措施之一:
在函數(shù)聲明前加上關(guān)鍵字inline
在函數(shù)定義前加上關(guān)鍵字inline
內(nèi)鏈函數(shù)的運(yùn)行速度比常規(guī)函數(shù)稍快,但代價(jià)是需要占用更多內(nèi)存。如果程序在10個(gè)不同的地方調(diào)用了同一個(gè)內(nèi)聯(lián)函數(shù),則改程序?qū)摵瘮?shù)代碼的10個(gè)副本,如下圖所示:
什么情況下應(yīng)該考慮使用內(nèi)聯(lián)函數(shù)?
函數(shù)代碼執(zhí)行時(shí)間很短
如果使用C語言的宏執(zhí)行了類似函數(shù)的功能,應(yīng)考慮將他們轉(zhuǎn)換為C++內(nèi)聯(lián)函數(shù)
注意:當(dāng)函數(shù)過大或函數(shù)遞歸 了,則編譯器可能不會(huì)將其視為內(nèi)聯(lián)函數(shù)對待。
相關(guān)文章
C語言數(shù)據(jù)結(jié)構(gòu)線性表教程示例詳解
這篇文章主要為大家介紹了C語言數(shù)據(jù)結(jié)構(gòu)線性表的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-02-02
C++利用函數(shù)動(dòng)態(tài)創(chuàng)建二維數(shù)組
這篇文章主要為大家詳細(xì)介紹了C++利用函數(shù)動(dòng)態(tài)創(chuàng)建二維數(shù)組,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-09-09
opencv3/C++視頻中疊加透明圖片的實(shí)現(xiàn)
今天小編就為大家分享一篇opencv3/C++視頻中疊加透明圖片的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-12-12
C++?Qt開發(fā)之使用QNetworkAccessManager實(shí)現(xiàn)Web網(wǎng)頁訪問
Qt?是一個(gè)跨平臺(tái)C++圖形界面開發(fā)庫,利用Qt可以快速開發(fā)跨平臺(tái)窗體應(yīng)用程序,本文主要介紹了如何運(yùn)用QNetworkAccessManager組件實(shí)現(xiàn)Web網(wǎng)頁訪問,需要的可以參考下2024-03-03
深入解析C++設(shè)計(jì)模式編程中解釋器模式的運(yùn)用
這篇文章主要介紹了C++設(shè)計(jì)模式編程中解釋器模式的運(yùn)用,解釋器模式給定一個(gè)語言,定義它的文法的一種表示,并定義一個(gè)解釋器,這個(gè)解釋器使用該表示來解釋語言中的句子,需要的朋友可以參考下2016-03-03
C++實(shí)現(xiàn)簡單的學(xué)生成績管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)簡單的學(xué)生成績管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
美化你的代碼 vb(VBS)代碼格式化的實(shí)現(xiàn)代碼
雖然VB.NET出現(xiàn)很久了,但還有好多人仍然在使用VB6。我在實(shí)現(xiàn)一些小功能的時(shí)候也喜歡用VB6,畢竟誰都不想每天的美好心情被VS那烏龜般的啟動(dòng)速度影響2012-05-05

