亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++基礎入門教程(九):函數指針之回調

2020-01-26 15:11:15
字體:
來源:轉載
供稿:網友

在Java,要實現某個時間調用某段代碼,是很簡單的事情,那就是使用接口。
而在C++里,有一個比較高深的方式,那就是使用函數指針。

比如Cocos2d-x的定時器(schedule)、消息訂閱(NotificationCenter)都使用了函數指針來完成回調的功能。
這也是為什么我們總是能把某個函數作為參數傳進去,然后在某個時刻這個函數會被調用。

一、函數的地址

要獲取一個int變量的地址很簡單,比如int num; 那么num的地址就是&num。
而獲取函數的地址更簡單,函數的名字就是函數的地址,如下代碼:

復制代碼 代碼如下:

void hello();
int _tmain(int argc, _TCHAR* argv[])
{
    auto p = hello;
    p();
    return 0;
}
void hello()
{
    cout << "helloworld";
}

我們定義了一個hello函數,然后直接把函數名字賦值給指針p,于是,就可以把p當成了hello函數來使用了。
這很簡單吧。

二、聲明函數指針

獲取函數的地址很簡單,但是,如何聲明函數指針就變得不那么簡單了。
我們總不能每次都使用auto來逃避吧?有時候我們不得不顯式地聲明函數指針,那么,如何聲明呢?
還記得我們說過的typedef定義類型別名嗎?函數指針的聲明也是一樣的規則,先聲明一個函數,如:void hello();
然后把函數名字換成指針,如:void (*p)();

沒錯,就是這么簡單,void (*p)(); 就是void hello(); 的聲明了。
立刻再來試試,這個函數:int getValue(float dt);
它的函數指針聲明是什么?沒錯,就是:int (*p) getValue(float dt);

沒錯,就是這么簡單int getValue(float dt); 就是int (*p) getValue(float dt);的函數指針聲明了。
立刻再來試試,這..(小若:停~!別以為我不在你就可以亂來?。?/p>

好吧,那就不繼續試了,我們來看看,剛剛那段代碼可以這樣寫:

復制代碼 代碼如下:

void hello();
int _tmain(int argc, _TCHAR* argv[])
{
    void (*p)();
    p = hello;
    p();
    (*p)(); // 偷偷加了這句
    return 0;
}
void hello()
{
    cout << "helloworld";
}

好了,很簡單,不多說了~
另外,有沒有發現我偷偷又加了一句代碼?
沒錯,用(*p)();的方式也通過能成功調用hello函數,這是為什么呢?

三、歷史原因

由于p是指針,它指向的是hello函數的地址,所以,*p就代表hello函數,于是,(*p)()就等于hello(),這是正常的邏輯。
所以,其實(*p)()才是比較正常的調用方式。
 
然而,由于函數名本來就是指向了函數的指針,也就是說,hello其實也是指向了函數的地址。
換句話說,p和hello其實都是指針,那么,p的調用方式和hello的調用方式應該也是一樣的,于是,p()就相當于hello()。
 
這兩種方式都是正確的,其實語法這東西,就是人定的,歷史上前輩對這兩種方式各持所見,于是就容忍了這兩種看似沖突的方式同時存在了。
 
不過,我想,大部分人都會更喜歡直接用p(),而不是(*p)()吧。

四、typedef挽救復雜的函數指針

如下代碼:

復制代碼 代碼如下:

string hehe1(int num, float value);
string hehe2(int num, float value);
string hehe3(int num, float value);

int _tmain(int argc, _TCHAR* argv[])
{
    /* 聲明函數指針數組 */
    string(*p[3])(int num, float value) = {hehe1, hehe2, hehe3};

    string result = p[1](1, 2);
    cout << result.c_str() << endl;
    return 0;
}

string hehe1(int num, float value)
{
    return "haha1";
}
string hehe2(int num, float value)
{
    return "haha2";
}
string hehe3(int num, float value)
{
    return "haha3";
}

這段代碼有三個參數和返回值都相同的函數,分別是hehe1、hehe2、hehe3
然后,我們要聲明一個數組,這個數組用來存放這三個函數指針。
這里的函數還算是比較簡單的,所以看起來不算復雜。
但如果這樣的聲明出現太多的話,未免會讓人很沮喪。

于是,typedef挽救了我們,我們可以復雜的聲明變成這樣:

復制代碼 代碼如下:

int _tmain(int argc, _TCHAR* argv[])
{
    /* 用HeheFunc來代替復雜的函數聲明 */
    typedef string(*HeheFunc)(int num, float value);
    /* 聲明函數指針數組 */
    HeheFunc p[3] = { hehe1, hehe2, hehe3 };
    string result = p[1](1, 2);
    cout << result.c_str() << endl;
    return 0;
}

使用typedef代替函數聲明之后,我們就能很輕松地使用它,并且會讓我們的代表變得很簡單,很好理解。
現在,HeheFunc就代表了一種類型,什么類型呢?就是參數為(int num, float value),返回值為string的函數類型。

五、結束

好了,就嘮叨這么多吧。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩欧美国产激情| 91久久国产综合久久91精品网站| 久久人人爽亚洲精品天堂| 成人午夜一级二级三级| 国产成人综合久久| 欧美日韩中文字幕日韩欧美| 日韩有码在线观看| 亚洲欧美日韩在线高清直播| 2021久久精品国产99国产精品| 精品国产一区二区三区久久久| 亚洲va电影大全| 最近更新的2019中文字幕| 日韩在线观看网站| 亚洲国产成人久久综合| 精品美女国产在线| 欧美一级电影免费在线观看| 久久久久久久av| 超在线视频97| 亚洲一区二区久久久久久| 国产日韩精品在线| 欧美日韩另类字幕中文| 亚洲人成网站色ww在线| 中文字幕亚洲精品| 欧美精品久久久久久久久| 黄网动漫久久久| 中文字幕久热精品视频在线| 欧美日韩精品中文字幕| 久久成人精品视频| 国产97人人超碰caoprom| 亚洲一区亚洲二区亚洲三区| 91视频九色网站| 国产精品久久久久aaaa九色| 国产91在线播放精品91| 萌白酱国产一区二区| 夜色77av精品影院| 久久久久久欧美| 成人欧美一区二区三区在线湿哒哒| 日韩亚洲在线观看| 91久久久久久久一区二区| 亚洲毛片在线观看.| 不卡av在线网站| 国产精品高清在线| 成人久久一区二区三区| 国产一区二区三区四区福利| 国产99久久精品一区二区永久免费| 日韩激情av在线免费观看| 亚洲色图欧美制服丝袜另类第一页| 日韩av在线资源| 中文字幕亚洲一区二区三区| 欧美一级片久久久久久久| 国产精品久久久久久久app| 精品国产区一区二区三区在线观看| 日韩毛片中文字幕| 色多多国产成人永久免费网站| 欧美成人精品三级在线观看| 91精品国产免费久久久久久| 久久久精品一区二区三区| 欧美午夜精品在线| 亚洲天堂开心观看| 久久影视三级福利片| 国产精品日韩专区| 欧美大胆a视频| 色综合五月天导航| 国产美女精品免费电影| 精品女同一区二区三区在线播放| 欧美尺度大的性做爰视频| 亚洲人午夜色婷婷| 国产精品视频区| 久久久久久久久久国产| 97精品国产97久久久久久免费| 欧美性色视频在线| 日韩精品中文字幕视频在线| 亚洲天堂第二页| 亚洲第一区中文99精品| 亚洲自拍偷拍视频| 国色天香2019中文字幕在线观看| www.xxxx精品| 91欧美视频网站| 欧美自拍视频在线观看| 欧美性猛交xxxx久久久| 色婷婷av一区二区三区在线观看| 国产成人91久久精品| 日韩在线观看免费全| 久久久噜噜噜久久| 欧美视频精品一区| 欧美精品18videosex性欧美| 亚洲电影中文字幕| 国产欧美久久久久久| 国产精品美女主播在线观看纯欲| 欧美激情精品久久久久久免费印度| www.欧美免费| 亚洲三级av在线| 91在线观看欧美日韩| 91久久精品美女高潮| 国产精品va在线播放| 精品亚洲一区二区三区在线观看| 久久久久久久久91| 亚洲乱亚洲乱妇无码| 国产精品久久久久久久久久ktv| 91精品国产精品| 久久久久久国产精品久久| 国内成人精品一区| 在线视频一区二区| 日韩在线免费视频| 久久久久久久999精品视频| 国产手机视频精品| 国产精品久久久久久久久久久久| 久久伊人91精品综合网站| 亚洲福利视频网| 免费91麻豆精品国产自产在线观看| 91av视频导航| 亚洲一区二区三区毛片| 欧美激情在线有限公司| 欧美在线观看www| 日韩av手机在线观看| 欧美激情视频给我| 一区二区三区无码高清视频| 国产视频综合在线| 欧美大学生性色视频| 俺去了亚洲欧美日韩| 5252色成人免费视频| 精品爽片免费看久久| 日韩亚洲精品电影| 日韩国产精品亚洲а∨天堂免| 欧美激情视频一区| 国产精品自拍偷拍| 亚洲电影在线看| 亚洲精品日韩在线| 日韩精品免费视频| 91po在线观看91精品国产性色| 国产成人综合久久| 国产伦精品一区二区三区精品视频| 国产经典一区二区| 中日韩午夜理伦电影免费| 91亚洲一区精品| 亚洲精品suv精品一区二区| 亚洲第一中文字幕在线观看| 91午夜理伦私人影院| 国产国语刺激对白av不卡| 欧美精品videossex性护士| 精品久久久久人成| 久久av在线看| 91免费人成网站在线观看18| 日韩在线中文字| 国产精品青草久久久久福利99| 国产精品热视频| 日韩中文字幕国产| 亚洲色图偷窥自拍| 亚洲xxxx做受欧美| 欧美激情亚洲激情| 亚洲欧美国产一区二区三区| 成人看片人aa| 久久久免费电影| 狠狠色狠色综合曰曰| 国产丝袜精品视频| 亚洲一区二区三区在线免费观看| 国产美女91呻吟求| 久久综合伊人77777尤物| 欧美在线观看日本一区| 欧美日韩亚洲高清| 国产在线视频欧美| 久久国产一区二区三区| 色99之美女主播在线视频| 亚洲一区二区中文|