C++函数指针

函数指针是指向函数的指针变量,它是一个指针,同时是指向一个函数。和一个整数指针,结构指针,或对象指针都是同一个道理。

1,基本定义

int Func(int,int);

这是声明一个函数。其中Func是其函数名,以此为调用标识。

int (*fp)(int,int);

这就是定义了一个函数指针,这个指针变量的名是fp,它是一个指针,指向一个函数,这个函数就是带两个INT类型的参数,返回一个int的函数。()的优先级最高,所以(*fp)是个函数,而*fp又标明,fp是个指针,是指向这个函数的指针。

这样就可以直接把上面定义的函数赋于此变量。

fp= Func;

这样在调用时:

(*fp)(1,2)和Func(1,2)是一样的情况,在VC中,fp(1,2)也是同样的效果。

 

2,typedef声明函数指针类型。

int (*fp)(int,int)定义了一个函数指针,如果有个类型是函数指针类型,以后每次定义变量时和int a一样直观就更好了,typedef就可以实现这样的目的,当然下面还会用到typedef的,还有其它的好处

typedef int (*FP)(int,int);

这就定义了一个类型FP,这个类型,就是函数指针类型,所有这一类型的变量都是指针,指向带两个int类型的参数返回int值的函数。

FP fpa, fpb;定义两个函数指针变量。也就是:

int (*fpa)(int,int); int (*fpb)(int,int);

fpa = Func; fpb = Func;

 

3,返回函数指针的函数

int (*ffp(int a))(int,int)

{

std::cout << "ffp(int)(int,int) " << a <<std::endl;

return Func;

}

 

看上面的定义,很显然是一个函数,但是它的定义形式好像有点特别,其实这就是一个带一个int参数和一个返回值的函数,而这个返回值不是其它的类型,是一个函数指针类型,就是返回是一个函数指针。

从里向外看,()优先级高。ffp(int a)是定义函数的形式,再结合*,标明它的返回值是个指针,而这个指针是什么类型呢?就是 int (*)(int,int)这些一个类型,就是函数指针类型。

如果用typedef会更直观一些。

typedef int (*FP)(int,int);

 

FP ffp(int a)

{

return Func;

}

 

再进一步,如果希望用指针的方式调用 ffp那怎么办呢?

定义一个指针

FP (*fffp)(int);

fffp = ffp;

fffp(1)(2,3);

 

typedef int (*(*FFFP)(int))(int,int);

FFFP fffp = ffp;

 

如果不用typedef

int (*(*ffpa)(int))(int,int); //从里向外结合

ffpa = ffp;

ffpa(1)(2,3);

 

4,函数指针用做函数的参数,同样。

void FwithFP(int a, int (*b)(int,int))

{

b(a,a+1);

}

 

FwithFP(1,Func); //call

 

 

5,成员函数指针

成员函数指针和普通的函数指针是不一样的。

操作符::*定义一个成员函数指针

操作符->*通过对象指针调用

操作符.*通过对象调用

 

class FunPtr

{

public:

int TestFun(int,int);

int (FunPtr::*memfunp)(int,int);

};

memfunp成员变量是个指针,指针成员函数,此函数带两个int类型的参数,返回int型的返回值。

 

memfunp = &FunPtr::TestFun;

 

FunPtr fp;

fp.*memfunp(1,2);

 

FunPtr* pfp = &fp;

pfp->*memfunp(1,2);

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值