指针函数

函数指针,一是普通函数指针 而是类成员函数指针:

例子如下 通过指针调用非成员函数:
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();
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值