/*
**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ù)。