关于函数指针的使用
1. 函数指针的类型
函数指针的类型由它的返回值和参数类型决定,与函数名无关。例如:
bool lengthCompare(const string &,const string &);
它的类型是bool(const string &,const string &)
,lengthCompare 则是指针名。
2. 声明
声明:bool(*pf)(const string &,const string &);
注意此处()不可以省去,省去就变成了返回值是bool* 的pf函数。
当我们把函数名当一个值来使用的时候,该函数自动转化成指针:
pf = lenthCompare
或者pf = &lengthCompare
都可以。
3. 指针形参
函数的形参可以是指向函数的指针,例如;
//第三个参数是函数类型,它会自动转换成指向函数的指针
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 &));
4. 函数指针的使用
直接使用函数指针类型显得冗长而繁琐,通常我们会使用typedef来简化函数指针的代码,例如:
//注意:此时Func为函数类型;
typedef bool Func(const string &,const string &);
//此时Funcp是函数指针;
typedef bool (*Funcp)(const string &,const string &);
5.实际使用例子:
- 未使用typedef时的代码:
#include<iostream>
using namespace std;
struct DATA
{
};
struct SNode
{
DATA data;
SNode *pNext;
};
int byName(SNode *p1,SNode *p2)
{
return 0;
}
int byNumb(SNode *p1,SNode *p2)
{
return 0;
}
int byMath(SNode *p1,SNode *p2)
{
return 0;
}
void Sort(int pfunc(SNode *p1,SNode *p2))
{//此时在使用时参数就显得冗长。
SNode *pi,*pj;
pi = pj = 0;
int i = pfunc(pi,pj);
return;
}
void Browse()
{
int i;
cin>>i;
switch (i)
{
case 1:
Sort(byName);
break;
case 2:
Sort(byNumb);
break;
case 3:
Sort(byMath);
break;
default:
break;
}
}
void main()
{
Browse();
return;
}
而使用typedef对函数指针重命名之后,如下:
#include<iostream>
using namespace std;
struct DATA
{
};
struct SNode
{
DATA data;
SNode *pNext;
};
typedef int (*pf)(SNode *p1,SNode *p2);//把函数指针的类型定义为pf,切记pf是一个类型名,而不是函数名;
int byName(SNode *p1,SNode *p2)
{
return 0;
}
int byNumb(SNode *p1,SNode *p2)
{
return 0;
}
int byMath(SNode *p1,SNode *p2)
{
return 0;
}
void Sort(pf pfunc)
{//此时在使用时就显得很简洁美观了,pfunc所指向的内容是由Browse调用的时传进来的。
SNode *pi,*pj;
pi = pj = 0;
(*pfunc)(pi,pj);
return;
}
void Browse()
{
int i;
cin>>i;
switch (i)
{
case 1:
Sort(byName);
break;
case 2:
Sort(byNumb);
break;
case 3:
Sort(byMath);
break;
default:
break;
}
}
void main()
{
Browse();
return;
}