C++的那些事:函数全解析
作者:网络转载 发布时间:[ 2014/5/14 13:12:53 ] 推荐标签:函数解析 net
四、函数指针
1,如何定义一个指针为函数类型?我们知道一个函数的类型是由它的返回类型和形参类型共同决定,而与函数名无关。所以在定义一个指向函数的指针,必须包含形参表与返回值这些信息。
下面来看一个比较两个字符串长度的函数:
bool lengthCompare(const string&, const string&);
那么这个函数的类型即bool(const string&, const string&) 。如果要想定义一具指向这种类型函数的指针,则可以如下定义:
bool (*pf) (const string&, const string&);
注意上式中*pf外面的括号不可以省略,不然pf成了一个函数的定义,这个函数返回一个指向bool类型的指针。
2,当我们把函数名作为一个值使用时,该函数自动地转换成指针,所以我们可以这样对函数指针pf初始化。
pf = lengthCompare;
pf = &lengthCompare;
上面两种方法是等价的。
那么在使用函数指针时,我们可以解引用,也可以不解引用。
bool b1 = pf("hello","goodbye");
bool b2 = (*pf)("hello","goodbye");
3,在给函数指针赋值的时候,一定要注意函数类型的完全匹配,但是我们可以给指向任意函数类型的指针赋一个nullptr或值为0的整型常量表达式,表示该指针没有指向任何一个函数。
4,如果定义了指向重载函数的指针,在使用这个指针时并不是根据形参来确定所调用的函数,而是根据指针的具体函数类型。即,编译器根据指针类型决定选用哪个函数,指针类型必须与重载函数中的某一个精确匹配。
void ff(int*);
void ff(int);
void ff(unsigned int);
void (*pf)(unsigned int) = ff; // pf指向ffunsigned int)
int num = 42;
pf(num); // num将转换为unsigned类型
5,函数指针作为另一个函数的形参。
有的时候,我们需要将一个函数作为一个参数传递给别一个参数,比如定义一个函数用来返回两个对象中较大的那个,那么我们需要将一个比较函数作为参数传递。
const string& BigString(const string& s1, const string& s2, bool pf(const string& ,const string&));
const string& BigString(const string& s1, const string& s2, bool (*pf)(const string& ,const string&));
上面定义的函数原型显得有点冗长,我们可以定义函数类型,来简化上面的代码:
// 定义函数类型
typedef bool Func(const string&, const string&);
typedef decltype(lengthCompare) Func;
// 定义指针类型
typedef bool (*Func)(const string&, const string&);
typedef decltype(lengthCompare)* Func;
有了上面的定义,我们可以简单BigString的定义了:
const string& BigString(const string& ,const string, Func);
6,函数返回值为一个函数指针。
我们知道,函数并不能返回一个函数,但是可以返回一个指向函数的指针。
简单的方法,我们用类型别名定义一种函数类型:
using F = int(int*,int); // F是一个返回int,接受一个指向int类型的指针和一个int类型,F是一种函数类型
using PF = int(*) (int*, int); // PF是一个函数指针类型
下面我们来定义返回函数指针的函数:
PF f(int); // f是一个函数,它返回一个函数指针
F f(int); // 错误:F是一个函数类型
F* f(int); // OK
当然我们也可以直接定义f:
int (*f(int)) (int*,int);
由内向外观察:首先f有一个形参表(int),所以f是一个函数,然后f的的左边有一个*,说明f返回的是一个指针。进一步发现,指针的类型本身也包含形参表,因此指针指向函数,该函数的返回类型是int。
我们还可以用C++11中的尾置返回类型来声明一个返回函数指针的函数:
auto f(int) -> int (*)(int*, int);
如果我们需要返回的函数类型有一个函数实例,那么我们可以用decltype来说明函数的类型:
int func(int*,int);
decltype(func)* f(int);
注意上面代码中decltype(func)返回的是一个函数类型,我们需要在后面加上*,说明一个函数指针类型。
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11