函數(shù)指針與用函數(shù)指針調(diào)用類的非靜態(tài)成員函數(shù)原理解讀

/*

**test20.cpp : Defines the entry point for the console application.

**系統(tǒng)winXP SP3 32位.

**函數(shù)指針與用函數(shù)指針調(diào)用類的非靜態(tài)成員函數(shù)原理

*/

#include "stdafx.h"

#include "iostream.h"



class CTest{

public:

void f1(){cout<<"CTest::f1()"<<endl;}

static void f2(){cout<<"CTest::f2()"<<endl;}

virtual void f3(){cout<<"CTest::f3()"<<endl;}

};

int main(int argc, char* argv[])

{

typedef void(*Cp1)(void); ???//指向參數(shù)為空,返回值為空的全局函數(shù)指針

Cp1 pf2 = CTest::f2;

pf2(); ??//CTest::f2(),通過函數(shù)指針調(diào)用靜態(tài)函數(shù)




typedef void (CTest::*Cp2)(void); ???//指向參數(shù)為空,返回值為空的成員函數(shù)指針

Cp2 pf1 = &CTest::f1;

Cp2 pf3 = &CTest::f3;

CTest ct;

(ct.*pf1)(); ??//CTest::f1(),使用對象調(diào)用

(ct.*pf3)(); ??//CTest::f3(),使用對象調(diào)用


CTest* pct = &ct;

(pct->*pf1)(); ??//CTest::f1(),使用對象指針調(diào)用

(pct->*pf3)(); ??//CTest::f3(),使用對象指針調(diào)用

return 0;

}

Tips1:函數(shù)指針就是指向函數(shù)首地址的指針,必須在編譯的時(shí)候確定下來,即這個地址是個常量。

Tips2:函數(shù)名就是函數(shù)的首地址,所以可以把函數(shù)名直接賦值給函數(shù)指針變量,而不用&符

Tips3:關(guān)于調(diào)用:1.直接把函數(shù)指針當(dāng)做函數(shù)名來調(diào)用,與普通函數(shù)調(diào)用一致。

2.把函數(shù)指針的引用*做函數(shù)名

Tips4:關(guān)于類的成員函數(shù)的函數(shù)指針:1.類的靜態(tài)成員函數(shù)不依賴類的存在而存在

2.其實(shí)在c語言中,任何成員函數(shù)的代碼體都是獨(dú)立于類對象存在,就是說沒有使用這個類其也在內(nèi)存中存在,只是非靜態(tài)的函數(shù)在編譯時(shí)候會加上前綴名,經(jīng)此處理后都變成了全局函數(shù),并且this作為其第一個參數(shù),綜上,所以用函數(shù)指針也能成功調(diào)用類的非靜態(tài)成員函數(shù)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容