C++函数指针的用法详解
C++函数指针详细理解
函数指针初识
函数指针是指向函数的指针,并不等于函数,它能够执行函数的操作,可以跟指针变量一起来理解,其基本声明格式为:
type (*ptrname)(形参列表);
例子,声明一个比较两个字符串大小的函数指针
bool (*cp)(const string s1, const string s2);
需要注意的是,不要去掉括号!!!如果去掉括号,含义就变成了返回一个bool指针的函数的声明!
函数指针指向函数类型
在使用函数指针时,函数指针可以发挥与函数相同的功效,即也可以起到执行任务的作用,但是函数指针需要初始化,而且不存在函数指针类型的转换,在进行初始化的时候,函数指针可以被赋值为
nullptr
或常量NULL
,或者指向一个函数,但是,指向这个函数时,需要有严格的要求,它需要严格按照两者的返回类型,形参列表相对应
例子
// 两个示例函数 bool compareLength(const string s1, const string s2){ //当s1的长度大于s2的长度,返回true,否则返回false return s1.size() > s2.size()?true:false; } int getLength(const string s1){ //返回字符串的长度 return s1.size(); } // 初始化前面定义的cp函数指针 cp = nullptr; // 正确,初始化为空 cp = NULL; // 正确,初始化为空常量NULL cp = compareLength; // 正确,函数的返回形式和形参列表和类型都是一样的 cp = getLength; // 错误,返回类型和形参列表不一样
使用函数
接着上面的思路,函数调用的方式可以这样写
// 函数指针调用函数 cp(s1, s2); // 调用2 (*cp)(s1, s2); // 函数调用,与cp一样 compareLength(s1, s2);
函数指针作为形参使用
可以将函数或者函数指针作为某一个函数的形式参数传入并使用,如C++11的thread头文件线程的构造函数中急需要传递一个函数指针的实例
#include<thread> std::thread t(函数指针, ..Args);
其声明定义形式如下,比如将上面定义的函数或函数指针传入一个新的函数中,作为两者的比较依据
int packageFunc(const string &s1, const string &s2, bool comp(const string &s1, const string &s2)){ if(comp(s1, s2)){ cout<<"Yes"<<endl; }else{ cout<<"No"<<endl; } } // 或者以指针的形式来声明函数形参, 这种定义与上面那种定义是等价的 int packageFunc(const string &s1, const string &s2, bool (*cp)(const string &, const string &));
考虑到这样的形式参数声明太过冗长,可以使用typedef和decltype来简化操作,比如上面代码又可以这样写
typedef bool Func(const string&, const string&); int packageFunc(const string &s1, const string &s1, Func); // 或者写成这样,这条语句与上面的typedef声明语句等价 typedef decltype(compareLength) Func2; int packageFunc(const string &s1, const string &s1, Func2)
或者定义成函数指针的形式
typedef bool (*fp)(const string &, const string &); int packageFunc(const string s1, const string s2, fp); // 定义成函数指针的形式,与上面的声明等价 typedef decltype(compareLength) *fp_ptr; int packageFunc(const string s1, const string s2, fp_ptr);
或者还可以这样写
using fp = bool (*)(const string &, const string &);
typedef
:是自定义数据类型的声名符,可以用于定义自己的数据类型,与using
有相似的地方
decltype
:它返回一个函数类型,即对传入的函数类型进行处理,返回一个返回类型和形参定义都与传入函数相等的函数类型,但是它无法将返回的函数类型自动转变为函数指针,所以再需要函数指针是要加*
号
函数指针作为返回值
函数指针也可作为返回值,比如传统的Unix进程间通过signal通信的方式的signal
函数就会返回函数指针类型,如
#include<signal.h> 函数指针 = signal(SIGABRT, 函数句柄); // 其返回的就是一个函数指针,即上一个与这个信号绑定的函数句柄,如果是第一次绑定返回NULL
但是函数类型不可,依据上面的简要声明,
using F = int(int *, int); using PF = int (*)(int*, int); PF f1(int); // 正确,PF为指函数的指针 F f2(int); // 错误,F为函数类型 F* f3(int); // 正确,显式的制定了函数返回函数指针的形式
也可以直接声明,但是不太好理解,会导致代码的可读性差,不建议这样做
int (*f1(int))(int*, int);
还可以以后置形式声明一个函数返回一个函数指针类型
auto f1(int) -> int (*)(int*, int);
练习
编写函数的声明,令其接收两个int形参并且返回类型也是int;然后声明一个vector对象,零其元素执行函数的指针
#include<iostream> #include<vector> using namespace std; int func1(int a, int b){ // 加法 return a+b; } int func2(int a, int b){ // 减法 return a - b; } int main(int argc, char *argv[]){ decltype(func1) *p1 = func1, *p2 = func2; vector<decltype(func1)*> s = {p1,p2}; int a = 10,b = 5; printf("add:[%d + %d = %d]\n", a, b, s[1](a,b)); printf("sub:[%d - %d = %d]\n", a, b, s[1](a,b)); }
add:[10 + 5 = 5]sub:[10 - 5 = 5]
总结
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注猪先飞的更多内容!
原文出处:https://blog.csdn.net/qq_48201696/article/details/122335138
相关文章
- eval函数在php中是一个函数并不是系统组件函数,我们在php.ini中的disable_functions是无法禁止它的,因这他不是一个php_function哦。 eval()针对php安全来说具有很...2016-11-25
- 在php中eval是一个函数并且不能直接禁用了,但eval函数又相当的危险了经常会出现一些问题了,今天我们就一起来看看eval函数对数组的操作 例子, <?php $data="array...2016-11-25
- vector是表示可以改变大小的数组的序列容器,本文主要介绍了C++STL标准库std::vector的使用详解,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2022-03-06
Python astype(np.float)函数使用方法解析
这篇文章主要介绍了Python astype(np.float)函数使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-06-08- 这篇文章主要介绍了C++中取余运算的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-23
- 这篇文章主要介绍了Python中的imread()函数用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-16
- 这篇文章主要介绍了C++ string常用截取字符串方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
- 本文通过例子,讲述了C++调用C#的DLL程序的方法,作出了以下总结,下面就让我们一起来学习吧。...2020-06-25
- 本文主要介绍了C# 中取绝对值的函数。具有很好的参考价值。下面跟着小编一起来看下吧...2020-06-25
- 下面小编就为大家带来一篇C#学习笔记- 随机函数Random()的用法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
- 本篇文章主要介绍了C++中四种加密算法之AES源代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。...2020-04-25
- 整数拆分,指把一个整数分解成若干个整数的和。本文重点给大家介绍C++ 整数拆分方法详解,非常不错,感兴趣的朋友一起学习吧...2020-04-25
- CREATE FUNCTION ChangeBigSmall (@ChangeMoney money) RETURNS VarChar(100) AS BEGIN Declare @String1 char(20) Declare @String2 char...2016-11-25
Android开发中findViewById()函数用法与简化
findViewById方法在android开发中是获取页面控件的值了,有没有发现我们一个页面控件多了会反复研究写findViewById呢,下面我们一起来看它的简化方法。 Android中Fin...2016-09-20- 这篇文章主要介绍了C++中Sort函数详细解析,sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变...2022-08-18
- strstr() 函数搜索一个字符串在另一个字符串中的第一次出现。该函数返回字符串的其余部分(从匹配点)。如果未找到所搜索的字符串,则返回 false。语法:strstr(string,search)参数string,必需。规定被搜索的字符串。 参数sea...2013-10-04
- 这篇文章主要介绍了C++万能库头文件在vs中的安装步骤(图文),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-23
PHP函数分享之curl方式取得数据、模拟登陆、POST数据
废话不多说直接上代码复制代码 代码如下:/********************** curl 系列 ***********************///直接通过curl方式取得数据(包含POST、HEADER等)/* * $url: 如果非数组,则为http;如是数组,则为https * $header:...2014-06-07- Foreach 函数(PHP4/PHP5)foreach 语法结构提供了遍历数组的简单方式。foreach 仅能够应用于数组和对象,如果尝试应用于其他数据类型的变量,或者未初始化的变量将发出错误信息。...2013-09-28
- free函数是释放之前某一次malloc函数申请的空间,而且只是释放空间,并不改变指针的值。下面我们就来详细探讨下...2020-04-25