函数指针是指向函数的指针,并不等于函数,它能够执行函数的操作,可以跟指针变量一起来理解,其基本声明格式为:
type (*ptrname)(形参列表);
例子,声明一个比较两个字符串大小的函数指针
bool (*cp)(const string s1, const string s2);
需要注意的是,不要去掉括号!!!如果去掉括号,含义就变成了返回一个bool指针的函数的声明!
函数指针指向函数类型
在使用函数指针时,函数指针可以发挥与函数相同的功效,即也可以起到执行任务的作用,但是函数指针需要初始化,而且不存在函数指针类型的转换,在进行初始化的时候,函数指针可以被赋值为
nullptr
或常量null
,或者指向一个函数,但是,指向这个函数时,需要有严格的要求,它需要严格按照两者的返回类型,形参列表相对应
例子
// 两个示例函数bool comparelength(const string s1, const string s2){ //当s1的长度大于s2的长度,返回true,否则返回fal return s1.size() > s2.size()?true:fal;}int getlength(const string s1){ //返回字符串的长度 return s1.size();}// 初始化前面定义的cp函数指针cp = nullptr; // 正确,初始化为空cp = null; // 正确,初始化为空常量nullcp = 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; }el{ cout<<"no"<<endl; }}// 或者以指针的形式来声明函数形参, 这种定义与上面那种定义是等价的int packagefunc(const string &s1, const string &s2, bool (*cp)(const string &, const string &));
考虑到这样的形式参数声明太过冗长,可以使用typedef和decltype来简化操作,比如上面代码又可以这样写
typedef boo深化改革总目标l 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 *ar江西医科大学gv[]){ decltype(func1) *p1 = func1, *p小楼昨夜2 = 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]
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注www.887551.com的更多内容!
本文发布于:2023-04-04 10:54:48,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/195cb7e99f011dd7a6a468630be4b7db.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:C++函数指针的用法详解.doc
本文 PDF 下载地址:C++函数指针的用法详解.pdf
留言与评论(共有 0 条评论) |