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