一级棒(Eachfun)
一级棒 - 读书笔记 - C++ Primer - 指向函数的指针四
RSS订阅
指向函数的指针四
发表时间:2006-09-10 00:20:49 关键词:C++,MFC,VC,Primer,编程,教程,读书

  本文已经写到第四篇了,破例先公布程序代码,再来讲述“所以然”。
//假定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。

本站特约顾问律师常州东晟律师事务所朱立律师(电话13915029670,QQ646146109)提醒您:
本站文章皆为作者原创,其它媒体(包括但不限于报刊、杂志、网站、电视、电台)未经作者书面许可严禁转载(或部分摘录)!
发表评论
称呼:
QQ:
邮箱:
链接:
内容:
搜索: 百度搜索 Google搜索
Copyright©2000 - 2008 Eachfun.Com, All Rights Reserved 一级棒网络
苏ICP备05080156号
一级棒建站系统 http://www.eachfun.com 一级棒版权所有,未经许可不得商用!