一、函数指针的定义
顾名思义,函数指针指的是指向函数的指针。每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址,因而可以利用函数指针调用该函数。它的定义如下:
函数类型 (*指针名字)(函数形参表)
可以这样来理解这个定义(假设指针名字为PtrName):
① PtrName首先与‘*’相结合,这意味着PtrName是一个指针。
② PtrName与后面的括号相结合,说明该指针指向一个函数,函数形参表就是所指函数的形参表。
③ 前面的函数类型就是所指函数的返回类型。
实际上,函数指针和函数名都是指针,指向同一个入口地址(代码在内存中的首地址),只是函数指针是一个指针变量,能指向不同函数,而函数名只能指向本函数(不够灵活)。
二、typedef定义函数指针类型
在实际应用中,我们希望能定义一个类型,用这个类型定义多个函数指针。这需要使用typedef关键字,即:
typedef int (*pFun)(int, int)
这样,pFun就是一个类型了,可以用来定义函数指针变量。
三、应用
(1)函数指针指向一般函数或者类的静态成员函数。例如:
typedef int (*pFun)(int, int);
class CTest
{
public:
static int GetSum(int a, int b)
{
return (a + b);
}
};
int GetMax(int a, int b)
{
return (a > b) ? a : b;
}
void main
{
pFun pfun;
pfun = GetMax; //pfun指向一般函数
(*pfun)(50, 100); //*pfun取出所指向的内容,也就是函数GetMax的内容
pfun = CTest::GetSum;//pfun指向类的静态成员函数
(*pfun)(50, 100);
}
(2)函数指针指向类的成员函数。函数指针指向类的非静态函数与静态函数,在重定义函数指针类型上是有区别的。在例如:
class CTest
{
public:
int GetMax(int a, int b)
{
return (a > b) ? a : b;
}
int GetMin(int a, int b)
{
return (a < b) ? a : b;
}
};
typedef int (CTest::*pClassFun)(int, int); //指向类的非静态函数,这里要为函数指针指定类
void main()
{
pClassFun pfun = &CTest::GetMax; //这里应加上取地址符号&;类的成员函数是共享的,所以
//直接去类的成员函数地址
CTest *pCTest = new CTest;
(pCTest->*pFun)(50, 100);
delete pCTest;
}
(3)使用函数指针作为函数返回值。typedef将函数指针重定义为一种类型,该类型能像int、char等内置类型一样被使用。
class CTest;
typedef (*CTest::pClassFun)(int, int);
class CTest
{
public:
int GetRet(char cFlag)
{
case 'a' :
return &CTest::GetMax;
break;
case 'b' :
return &CTest::GetMin;
break;
default :
break;
}
private:
int GetMax(int a, int b)
{
return (a > b) ? a : b;
}
int GetMin(int a, int b)
{
rerurn (a < b) ? a : b;
}
}
void main()
{
CTest *pCTest = new CTest;
(pCTest->*pCTes->GetRet('a'))(50, 100);
}