5分钟搞懂C++函数指针与函数类型
函数指针和函数类型
函数指针指向的是函数而非对象。和其他指针类型一样,函数指针指向某种特定类型。
函数类型由它的返回值和参数类型决定,与函数名无关。
bool length_compare(const string &, const string &);
上述函数类型是:
bool (const string &, const string &);
上述函数指针pf:
bool (*pf)(const string &, const string &);
使用函数指针
当把函数名作为一个值使用时,该函数自动的转换成指针,如:
pf = length_compare <=>等价于 pf = &length_compare12
函数指针形参
函数类型不能定义为形参,但是形参可以是指向函数的指针;
函数作为实参使用时,会自动的转换成函数指针;
typedef bool Func(const string &, const string &) // Func是函数类型; typedef bool (*FuncP)(const string &, const string &) // FuncP是函数指针类型; typedef decltype(length_compare) Func2 // Func2是函数类型; typedef decltype(length_compare) *Func2P // Func2P是函数指针类型;
注意decltype(length_compare)返回的是函数类型,而不是函数指针类型; using FTtype = int(int,int); //函数类型 typedef int (*pf)(int, int); //函数指针 int func(int a, int b){return a+b;} void print(int a, int b, FTtype fn){ // 编译器将其隐式转化成函数指针 cout << fn(a,b) << endl; } int main() { print(1,2,func); cout << typeid(FTtype).name() << endl; cout << typeid(func).name() << endl; cout << typeid(decltype(func)).name() << endl; cout << typeid(pf).name() << endl; return 0; }
下面两个声明语句是同一个函数,因为编译器会自动的将FTtype 转换成函数指针类型。
void print(int a, int b, FTtype fn);
void print(int a, int b, pf fn);
返回指向函数的指针
虽然不能返回一个函数,但是能返回执行函数类型的指针。和函数参数不同,编译器不会自动地将函数返回类型当作指针类型处理,必须显示的将返回类型指定为指针。如:
using F = int(int*, int); using PF = int(*)(int*,int); F f1(int); //错误: F是函数类型 PF f1(int); //正确: PF是函数指针类型
f1也可以写出下面两种形式:
int (*f1(int))(int*, int);
auto f1(int)->int(*)(int*, int);
作者:guoxiaojie_415
来源:https://blog.csdn.net/guoxiaojie_415/article/details/79921788
原文发布时间为:2018-09-30
原文作者:良许Linux

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
JavaScript ES6 让我们写得少,做得多
JavaScript ES6 带来了新的语法和新的强大功能,使您的代码更现代,更易读。它允许您编写更少的代码并执行更多操作。 ES6 向我们介绍了许多强大的功能,如箭头函数,模板字符串,对象结构,模块等,让我们来看看。 const and let const 是 ES6 中用于声明变量的新关键字。 const 比 var 更强大。使用后,无法重新分配变量。换句话说,它是一个不可变的变量,除非它与对象一起使用。 这对于定位选择器非常有用。例如,当我们有一个触发事件的按钮时,或者当您想在 JavaScript 中选择 HTML 元素时,请使用 const 而不是 var。这是因为 var 会被提升,当不想重新分配变量时,最好使用 const。 // ES5 var MyBtn = document.getElementId('mybtn'); // ES6 const MyBtn = document.getElementById('mybtn');在上面的代码中,const 不会更改,也不能重新分配。如果您尝试为其赋予新值,则会返回错误。 let name = "Said"; name ...
- 下一篇
JavaScript—掌握跨域(24)
跨域这两个字就像一块狗皮膏药一样黏在每一个前端开发者身上,无论你在工作上或者面试中无可避免会遇到这个问题。为了应付面试,我每次都随便背几个方案,也不知道为什么要这样干,反正面完就可以扔了,我想工作上也不会用到那么多乱七八糟的方案。到了真正工作,开发环境有webpack-dev-server搞定,上线了服务端的大佬们也会配好,配了什么我不管,反正不会跨域就是了。日子也就这么混过去了,终于有一天,我觉得不能再继续这样混下去了,我一定要彻底搞懂这个东西!于是就有了这篇文章。 要掌握跨域,首先要知道为什么会有跨域这个问题出现确实,好好的调个接口告诉我跨域了,为什么会跨域?是谁在搞事情?为了找到这个问题的始作俑者,请点击浏览器的同源策略这么官方的东西真难懂,没关系,至少你知道了,因为浏览器的同源策略导致了跨域,就是浏览器在搞事情。所以,浏览器为什么要搞事情?就是不想给好日子我们过?对于这样的质问,浏览器甩锅道:“同源策略限制了从同一个源加载的文档或脚本如何与来自另一个源的资源进行交互。这是一个用于隔离潜在恶意文件的重要安全机制。”这么官方的话术真难懂,没关系,至少你知道了,似乎这是个安全机制。所...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Hadoop3单机部署,实现最简伪集群
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Windows10,CentOS7,CentOS8安装Nodejs环境
- 设置Eclipse缩进为4个空格,增强代码规范
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Linux系统CentOS6、CentOS7手动修改IP地址
- Docker安装Oracle12C,快速搭建Oracle学习环境