(39)函数指针

函数指针指向的是函数而非对象。和其他指针一样,函数指针指向某种特定类型。函数的类型由它的返回类型和形参类型共同决定,与函数名无关。

当我们把函数名作为一个值使用时,该函数自动地转换成指针。直接使用指向含税的指针调用该函数,无须以前解引用指针。

在指向不同函数类型的指针间不存在转换规则。但是和往常一样,我们可以为函数指针赋给一个nullptr或者值为0的整箱常量表达式表示该指针没有指向任何一个函数。

重载函数的指针

编译器通过指针类型决定选用那个函数,指针类型必须与重载函数中的某一个精确匹配。

函数指针形参

虽然不能定义函数类型的形参,但是形参可以是指向函数的指针。此时,形参看起来是函数类型,实际上却是当成指针使用:
//第三种形参是函数类型,它会自动地转换成指向函数的指针
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 &));

我们可以直接把函数作为实参使用,此时它会自动转换成指针:

//自动将函数lengthCompare转换成指向该函数的指针
useBigger(s1,s2,lengthCompare);

使用decltype简化声明:
//func和func2是函数类型
typedef bool func(const string &,const string &);
typedef decltype(lengthCompare) func2; //等价的类型
//funcp和funcp2是指向函数的指针
typedef bool (*funcp)(const string &,const string &);
typedef decltype(lengthCompare) *funcp2; //等价的类型
decltype返回函数类型,此时不会将函数类型自动转换成指针类型。因为decltype的结果是函数类型,所以只有在结果前面加上*才能得到指针。

返回指向函数的指针

想返回函数类型的指针,我们必须把返回类型写成指针形式,编译器不会自动地将函数返回类型当成对应的指针类型处理。要想声明一个返回函数指针的函数,最简单的办法是使用类型别名:
using F = int (int*,int);             //F是函数类型,不是指针
using PF = int(*) (int*,int);	      //PF是指针类型
和函数类型的形参不一样,返回类型不会自动地转换成指针。我们必须显式地将返回类型指定为指针:
PF f1(int);
F  *f1(int);
当然,我们也能用下面的形式直接显式声明f1:
int (*f1(int))(int*,int);
使用尾置返回类型的方式声明一个返回函数指针的函数:
auto f1(int)->int(*)(int *,int);


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值