函数指针,一是普通函数指针 而是类成员函数指针:
例子如下 通过指针调用非成员函数:
typedef void (*pFun)();//声明一个无参并且返回值是 void类型的函数指针类型
typedef void (*pFunInt)(int); //声明一个有一个整数做参数的并且返回值是 void类型的函数指针类型
void FunOne(){cout<<"被指针调用了"<<endl;};//定义一个函数以进行调用测试
void FunTwo(int n){cout<<n<<endl;}
pFun pf = FunOne;//定义一个函数指针 并初始指向一个函数
pFunInt pfInt = FunTwo;
void main()
{
pf();//由该函数指针进行函数的调用执行
pfInt(8);
cout<<pf<< "__"<<FunOne<<endl;//二者地址完全相同
cout<<pfInt<<"__"<<FunTwo<<endl; //二者地址完全相同
cout<<sizeof(pfInt)<<endl;//指针是个32位的地址共4个字节 输出是4
getchar();
}
成员函数指针:
通过指针调用函数 调用类成员函数,所谓指针函数就是声明一个指针指向一个函数块的首地址,通过指针找到该函数的地址,由函数执行标志()来执行该函数。
调类成员函数:
class FunPointer;
typedef void (FunPointer::*pFP)();//如此定义一个指向成员函数的指针的类型
class FunPointer
{
public:
~FunPointer(){};
static pFP Print()
{
return &FunPrint;//返回一个函数地址
}
protected:
private:
void FunPrint()
{
cout<<"Hello"<<endl;//定义要调用的类成员函数
}
};
pFP pF = FunPointer::Print();//定义一个类成员函数指针 并赋值
void main()
{
FunPointer ppF;//声明一个类对象
(ppF.*pF)();//应当这样调用成员函数
getchar();
}
注:由于类成员函数是一个对象的成员函数,所以必须给它指定相应的对象,加入不指定相应对象,那么试想如果该成员函数内部要调用类成员变量时,它怎样知道相应的变量值呢。
用外部的函数来实现类内的成员函数代码:
class CBase;
typedef void (*pBase)();// 定义一个函数指针
class CBase//定义一个抽象基类
{
public:
virtual~CBase(){};
void Draw(){pDraw();};
virtual void Init(pBase pFun) = 0;//纯虚函数
public:
pBase pDraw;// 一个函数指针
};
class CInstance : public CBase
{
public:
~CInstance(){};
void Init(pBase pFun)
{
pDraw = pFun;//通过调用该函数 初始化该函数指针
}
};
void DrawFun()
{
cout<<"调用DrawFun()函数成功"<<endl;
}
void main()
{
pBase pb = DrawFun;//定义一个函数指针指向我们外部定义的函数
CInstance Instance;//定义一个子类实例
Instance.Init(pb);//通过函数指针的调用初始化我们类成员内部的函数
Instance.Draw();//调用该函数 测试成功
getchar();
}
使用reiterpret_cast 进行函数指针类型转换
#define NUM_SIZE 3
typedef void (*pFUN)();
pFUN pF[NUM_SIZE]= {NULL};
void FunOne(){cout<<"FunOne"<<endl;}//依次声明三个不同的函数
int FunTwo(){cout<<"FunTwo"<<endl;return 0;}
float FunThree(){cout<<"FunThree"<<endl; return 0.0;}
void main()
{
pF[0] = FunOne;
pF[1] = reinterpret_cast<pFUN>(&FunTwo);//将函数指针类型转换
pF[2] = reinterpret_cast<pFUN>(&FunThree);
for (int n =0; n < NUM_SIZE; n++)
{
(*(pF+n))();//逐次调用相应的函数指针执行相应的函数 成功
}
getchar();
}