博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
函数对象
阅读量:5500 次
发布时间:2019-06-16

本文共 1726 字,大约阅读时间需要 5 分钟。

首先我们看一下函数指针。

函数指针是指向函数的指针变量,在编译程序时,每一个函数都有一个入口地址,而指向这个函数的函数指针便指向这个地址。函数指针的作用主要有两个:用作调用函数和用作函数的参数。

函数指针用作调用函数的实例如下:

#include 
using namespace std;typedef void (*PFT) ( char ,int );void bar(char ch, int i){ cout<
<<' '<
<

我们可以在一个函数的形参列表中传入一个函数指针,然后便可以在这个函数中使用该函数指针所指向的函数,这样可以使程序变得更加清晰和简洁。函数指针用作函数参数的实例如下:

#include 
using namespace std;typedef void (*PFT) ( char ,int );void bar(char ch, int i){ cout<
<<' '<
<

上述例子中我们首先利用一个函数指针pft来指向函数bar,然后在函数func中使用函数指针pft来调用函数bar。将这个特点稍加利用,我们就可以构造出强大的程序,只需要用同样的func函数便可以实现对不同bar函数的调用。

前面讲的是函数指针的应用,从一般的函数回调意义上来说,函数对象和函数指针是相同的,但是函数对象却具有许多函数指针所不具有的特点,从而使得程序设计更加灵活,而且能够实现函数的内联(inline)调用,使整个程序实现性能加速。

重载函数调用操作符的类,其对象常称为函数对象,即它们是行为类似函数的对象。一个类对象,表现出一个函数的特征,就是通过“对象名+()”的方式来实现的,如果没有上下文,完全可以把它看作一个函数对待。这是通过类的operator()来实现的,如下:

#include 
using namespace std;class A{public: int operator()(int x){
return x;}};int main(){ A a; a(5); return 0;}

这样a就成为一个函数对象,当我们执行a(5)时,实际上就是利用了重载运算符函数operator(),函数对象既然是一个类对象,那么我们当然可以在函数形参列表中调用它,它完全可以取代指针,如下:

#include 
using namespace std;class Func{public: void operator()(int a ,int b) { cout<
<<'+'<<<'='<
<

上述例子中首先定义了一个函数对象类,并重载了operator()函数,然后在函数addFunc中的形参列表中使用这个类对象。

如果运用泛型思维来考虑,可以定义一个函数模板类,来实现一般类型的数据相加减等操作,如下:

#include 
using namespace std;class Func{public: template
void operator()(T a ,T b) { cout<
<<'+'<<<'='<
<
void addFunc(T a,T b,Func &func){ func(a,b);}int main(){ Func func; addFunc(1,3,func); addFunc(1.4,2.3,func); return 0;}

转载于:https://www.cnblogs.com/kevinq/p/4605981.html

你可能感兴趣的文章
discuz X3登录流程分析
查看>>
javascript事件响应
查看>>
通过script标签实现JSONP跨域调用
查看>>
用jQuery实现Ajax
查看>>
***微信公众平台开发: 获取用户基本信息+OAuth2.0网页授权
查看>>
上传图片预览
查看>>
vim编辑器
查看>>
程序设计的一些原理
查看>>
iTerm的安装以及配置
查看>>
explore my oracle support using firefox 3.6
查看>>
《社交网站界面设计(原书第2版)》——1.7 反模式的重要性
查看>>
2016上半年DDoS攻击报告:DDoS攻击的规模和攻击频率都在不断攀升
查看>>
混合云、区块链、认知技术,还有哪一样前沿技术是IBM没提到的吗?
查看>>
呼叫中心现场管理人员注意事项
查看>>
nagios监控远程windows服务器
查看>>
lagp,lacp详解
查看>>
J2ee项目性能调优-垃圾收集器(gc)
查看>>
LVS之DR模式原理与实践
查看>>
自动化运维之SaltStack(概述及简单配置实例)
查看>>
导出excel
查看>>