C++函数指针

函数指针指向的是函数而非对象
bool lengthCompare (const string &,const string &);

要想声明一个指向函数的指针,只需要用指针替换函数名即可

//pf指向一个函数,该函数的参数是两个const string的引用,返回值是bool类型
bool (*pf) (const string &,const string &);//只是声明,未初始化

声明了一个指向函数的指针,其中该函数的参数是两个const string 的引用,返回值是bool类型。
使用时需要赋值

pf =lengthCompare;//pf指向名为lengthCompare的函数
pf=&lengthCompare;//等价的赋值语句,取地址符&是可选的

使用时

bool b1=pf("hello","goodbye");
bool b2=(*pf)("hello","goodbye");
bool b3=LengthCompare("hello","goodbye");
//三个等价调用

当我们定义重载函数时,指针类型必须与重载函数中的一个精确匹配(形参列表,及返回值)

void ff(int *);
void ff(unsigned int);

void (*pf1) (unsigned int)=ff;//pf1指向ff(unsigned)
void (*pf2) (int) =ft;//错误,没有任何一个精确匹配
double (*pf3) (int *)=ff;//错误,没有任何一个匹配

函数指针形参

和数组类似,虽然不能定义函数类型的形参,但是形参可以是指向函数的指针

//第三个形参是函数类型,它会自动地转成指向函数类型的指针
void useBigger(const string &s1,const string &s2, bool pf(const string &,const string&));
//等价
void useBigger(const string &s1,const string &s2,bool (*pf)(const string&,const string&));
//自动将函数转换成指向该函数的指针
useBigger(s1,s2,lengthCompare);

但是上面这种做法并不建议,因为useBigger的声明语句显得繁琐,建议使用类型别名或decltype类型识别符来进行简化

//示例函数int func(int a,int b);
//指向函数的指针
using pFunc1=decltype(func)*;
typedef decltype(func)* pFunc2;
using pFunc3=int(*)(int a,int b);
typedef int(*pFunc4)(int a,int b);
//之后再用pFunc1......来当形参
会简便很多

因为decltype作用于函数时,返回的时函数类型而非指针类型,所以我们需要显式地加上*

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值