指向函数的指针四

  本文已经写到第四篇了,破例先公布程序代码,再来讲述“所以然”。
//假定int Bigger(int)和int Smaller(int)已经声明
//请参照上文《指向函数的指针二》
typedef int (*cmpFun)(int);//定义一个别名
cmpFun GetFun(void)//用别名来声明GetFun的返回值
{
  return Bigger;
}
cmpFun GetFun1(void)
{
  return Smaller;
}
cmpFun p1;//用别名来定义指针
int t = 5;
p1 = GetFun();//调用GetFun,获取Bigger(int)的指针
cout << p1(t) << endl;//调用Bigger(int),输出6
p1 = GetFun1();
cout << p1(t) << endl;//输出4
  对于GetFun来说,我们要关心的是它的返回值,所以我将它的参数弱化为void。由于事先已经为“指向‘int (*)(int)类型’的函数的指针”定义了别名,所以声明起来很简单,返回值就是“cmpFun类型”。这个函数的返回值可以直接给指针p1赋值,p1获得赋值后,可以直接调用Bigger(int)或Smaller(int)函数。
  之所以先公布使用typedef的写法,是因为这种写法方便易懂,可能读者不觉得这很好懂,您若是见了不用typedef的写法,一定会“头昏昏眼蒙蒙”,比如GetFun函数的写法要由以下写法一改为写法二:
cmpFun GetFun(void);//写法一
int (*GetFun(void))(int);//写法二
  写法二之所以会让人头昏,是因为一行语句里出现两个函数,将这两个函数分解一下也许会更易于理解:一个是你刚声明的函数“GetFun(void)”一个是该函数的返回值类型“int (*)(int)”。只是,这里没有像写法一那样,将函数放在返回值类型后面,而是插在某一个特殊的位置。
  我第一遍读到此处时理解反了,以为一个是“GetFun(int)”,而返回值是“int (*)(void)”。我相信这样理解的人不止我一个,而彻底不理解写法二的人应该也不在少数。如果本文的读者读到这里还没有懂明白,那么我给你建议两条路:一是继续思考,二是抛弃这种写法而专注于使用typedef。

本文转自
http://toumao.blog.sohu.com/12868794.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值