函数指针

以下内容摘自 c++primer(第五版)

函数指针指向的函数而非对象。与其他指针一样,函数指针也指向特定的类型。函数的类型是由返回值和参数列表决定,与函数名无关。例如:

//比较两个字符串的长度
bool lenghtCompare(const string &s1, const string &s2);

函数的类型是bool(const string &s1, const string &s2)。想要声明一个指向该函数的指针,只需要使用指针替换掉函数名即可:

//比较两个字符串的长度
//pFunc是一个指向函数的指针,函数的参数是两个const string&,返回值是bool类型。
bool (*pFunc)(const string &s1, const string &s2); //未初始化

(*pFunc)种的()不可少。

使用函数指针

当把函数名当做一个值时,函数自动转换成指针。按照如下形式,我们可以把lenghtCompare赋值给pFunc:

pFunc = lenghtCompare; //pFunc指向名为lenghtCompare的函数
pFunc = &lenghtCompare; //等价模式,取地址符(&)是可选的

此外,我们还可以使用指向函数的指针调用该函数,无需解引用符:

//以下都是调用的同一函数
bool b1 = pFunc("11", "22");
bool b2 = *pFunc("11", "22");
bool b3 = lenghtCompare("11", "22");

指向不同函数类型的指针不存在转换规则。但是可以允许函数指针指向nullptr或者0,表示不指向任何函数:

string::size_type lenghtCompare1(const string &s1, const string &s2);
bool lenghtCompare2(const char *s1, const char *s2);
pFunc = 0;//正确,不指向任何函数
pFunc = lenghtCompare1;//错误,返回值类型不匹配
pFunc = lenghtCompare2; //错误,参数类型不匹配

重载函数的指针

当函数指针指向重载函数时,一定要在上下文中明确的界定选用哪一个函数。如果定义了指向重载函数的指针:

void ff();
void ff(int);
void ff(int *);

编译器通过指针类型来决定指向哪个函数,必须精确匹配到某一个函数。

void (*pf)() = ff; //正确
int (*pf)() = ff; //错误,返回值类型不匹配
void (*pf)(double *) = ff; //错误,参数列表不匹配

函数指针形参

与数组类似,虽然不能将函数作为形参,但是可以使用函数的指针作为形参。当我们把一个“函数”作为形参时,实际上是当成了指针使用:

//第三个参数是函数类型,自动转换成函数指针
void ff(int, int, int f1());
//与上一个函数声明等价
void ff(int, int , int (*pf)());

我们也可以直接把函数作为实参使用,这时候函数转换成了指针:

int f1();
ff(1,2,f1);

我们可以使用类型别名和decltype来简化使用函数指针的代码:

bool lenghtCompare(const string &s1, const string &s2); 
//Func1和Func2都是函数类型
typedef bool Func1(const string &s1, const string &s2);
typedef decltype(lenghtCompare) Func2;

//FuncP1和FuncP2都是函数指针
typedef bool (*FuncP1)(const string &s1, const string &s2);
typedef decltype(lenghtCompare) *FuncP2;

返回指向函数的指针

与数组类似,虽然函数不能返回函数类型,但是可以返回函数指针。然而,我们必须返回的是函数的指针形式,因为返回函数类型编译器不会自动将其转换为函数指针:

using f = int(int *, int); //函数类型
using pf = int (*)(int *, int);//函数指针

f f1(); //错误,函数类型不能作为返回值
pf f2(); //正确,可以返回函数指针
f *f3(); //正确,显示的指定函数返回的是函数指针类型

//等价形式
 int (*f())(int*, int); //由内向外,f有形参列表,说明f是一个函数。前面有一个*,说明返回的是一个指针,
 						//指针带有形参列表。说明返回的是函数指针
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值