函数指针初识
函数指针是指向函数的指针,并不等于函数,它能够执行函数的操作,可以跟指针变量一起来理解,其基本声明格式为:
1 |
|
例子,声明一个比较两个字符串大小的函数指针
1 |
|
需要注意的是,不要去掉括号!!!如果去掉括号,含义就变成了返回一个bool指针的函数的声明!
函数指针指向函数类型
在使用函数指针时,函数指针可以发挥与函数相同的功效,即也可以起到执行任务的作用,但是函数指针需要初始化,而且不存在函数指针类型的转换,在进行初始化的时候,函数指针可以被赋值为
nullptr或常量NULL,或者指向一个函数,但是,指向这个函数时,需要有严格的要求,它需要严格按照两者的返回类型,形参列表相对应
例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
使用函数
接着上面的思路,函数调用的方式可以这样写
1 2 3 4 5 6 7 8 |
|
函数指针作为形参使用
可以将函数或者函数指针作为某一个函数的形式参数传入并使用,如C++11的thread头文件线程的构造函数中急需要传递一个函数指针的实例
1 2 3 |
|
其声明定义形式如下,比如将上面定义的函数或函数指针传入一个新的函数中,作为两者的比较依据
1 2 3 4 5 6 7 8 9 10 |
|
考虑到这样的形式参数声明太过冗长,可以使用typedef和decltype来简化操作,比如上面代码又可以这样写
1 2 3 4 5 6 |
|
或者定义成函数指针的形式
1 2 3 4 5 6 |
|
或者还可以这样写
1 |
|
typedef:是自定义数据类型的声名符,可以用于定义自己的数据类型,与using有相似的地方
decltype:它返回一个函数类型,即对传入的函数类型进行处理,返回一个返回类型和形参定义都与传入函数相等的函数类型,但是它无法将返回的函数类型自动转变为函数指针,所以再需要函数指针是要加*号
函数指针作为返回值
函数指针也可作为返回值,比如传统的Unix进程间通过signal通信的方式的signal函数就会返回函数指针类型,如
1 2 3 4 |
|
但是函数类型不可,依据上面的简要声明,
1 2 3 4 5 6 |
|
也可以直接声明,但是不太好理解,会导致代码的可读性差,不建议这样做
1 |
|
还可以以后置形式声明一个函数返回一个函数指针类型
1 |
|
练习
编写函数的声明,令其接收两个int形参并且返回类型也是int;然后声明一个vector对象,零其元素执行函数的指针
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|
1 |
|