c++入门之函数指针和函数对象
函数指针可以方便我们调用函数,但采用函数对象,更能体现c++面向对象的程序特性。函数对象的本质:()运算符的重载。我们通过一段代码来感受函数指针和函数对象的使用:
int AddFunc(int a, int b)
{
return a + b;
} class Add
{
public:
const int operator()(const int a,const int b)
{
return a+b;
}
}; int main()
{
//函数指针
int (*Add1)(int a,int b);
int (*Add2)(int a,int b);
Add1 = &AddFunc;
Add2 = AddFunc;//两种函数指针赋初值方法
cout << (*Add1)(,)<<endl; //
cout<<Add1(,)<<endl;//输出可以加*,也可以不加 //函数对象
Add addFunction;
cout<<addFunction(,)<<endl;//调用类的重载操作符()方法
system("pause");
return ;
}
我们可以看到:函数AddFunc和类Add本质上都是实现了对a+b的加法运算。从功能上讲,两者并无区别,但从设计上讲,两者的区别很大,一个将功能封装成函数,一个封装成类。
我们再来关注两种方式下的调用过程:
1 函数指针:
我们使用函数指针的目的在于:使用指针的方式来调用函数。
可能我们之前使用使用指针的场合过少,以至于使得我们忘了指针的强大(我们可以将指针指向任意一种类型,无论是基础类型,还是派生类型,只要指针定义的合理)。既然要使用指针调用函数,首先需要声明一个函数指针(这就如同你要想将一个指针指向整型数据,要先声明一个int*指针),声明了函数指针之后,将该指针指向我们要调用的函数(这就是第20行和21行做的事),函数指针指向了我们要调用的函数,就可以用函数指针来调用函数了(22行的代码)。因此,不管是函数指针还是其他指针,指针的基本使用思想是一致的:
1 定义 和所要指向对象类型相同(这里是函数)的指针(指向对象是什么类型,自己就是什么类型的指针)
2 将指针指向调用对象
3 使用指针的方式代替对象本身执行相应功能。
2 函数对象
我们使用函数对象的目的在于:使用对象(真正意义上的c++中的对象)的方式来调用函数(是不是和上面很类似)。
假如我们先不考虑运算符重载这个层面的东西,仅仅是考虑上层的东西,来思考其中的函数对象的运作机制:
首先,我们将所要执行的功能封装成了一个类(这个类本质上实现了()运算符的重载),因为我们封装成了类,所以我们可以声明对象;因为这个类本质上实现了函数运算符()的重载,所以我们将这个对象称之为函数对象。也就是,首先,我们基于c++的基本思想(万物皆可对象),将函数封装成了类,然后用该类声明对象,则该对象就是函数对象,使用这个函数对象,我们可以完成函数的调用。 我们来看看函数独享的基本使用过程是:
1 定义 和所要“指向”类型相同(这里是类)的(函数)对象
2 使用函数对象的方式执行相应的功能
我们可以发现:函数对象的使用更加简洁,也更加符合c++的程序设计思想!
c++入门之函数指针和函数对象的更多相关文章
- 函数指针玩得不熟,就不要自称为C语言高手(函数指针是解耦对象关系的最佳利器,还有signal)
记得刚开始工作时,一位高手告诉我说,longjmp和setjmp玩得不熟,就不要自称为C语言高手.当时我半信半疑,为了让自己向高手方向迈进,还是花了一点时间去学习longjmp和setjmp的用法.后 ...
- c++学习之初话 函数指针和函数对象 的因缘
函数指针可以方便我们调用函数,但采用函数对象,更能体现c++面向对象的程序特性. 函数对象的本质:()运算符的重载.我们通过一段代码来感受函数指针和函数对象的使用: int AddFunc(int a ...
- 获得函数返回值类型、参数tuple、成员函数指针中的对象类型
//function_traits.h,获得函数返回值类型.参数tuple.成员函数指针中的对象类型 //参考https://github.com/qicosmos/cosmos/blob/maste ...
- Delphi 函数指针(函数可以当参数)
首先学习: 指向非对象(一般的)函数/过程的函数指针 Pascal 中的过程类型与C语言中的函数指针相似,为了统一说法,以下称函数指针.函数指针的声明只需要参数列表:如果是函数,再加个返回值.例如声明 ...
- C#委托与C语言函数指针及函数指针数组
C#委托与C语言函数指针及函数指针数组 在使用C#时总会为委托而感到疑惑,但现在总新温习了一遍C语言后,才真正理解的委托. 其实委托就类似于C/C++里的函数指针,在函数传参时传递的是函数指针,在调用 ...
- Day8 函数指针做函数参数
课堂笔记 课程回顾 多态 virtual关键字 纯虚函数 virtual func() = 0; 提前布局vptr指针 面向接口编程 延迟绑定 多态的析构函数的虚函数. ...
- typedef void (*Fun) (void) 的理解——函数指针——typedef函数指针
首先介绍大家比较熟悉的typedef int i;//定义一个整型变量i typedef myInt int: myInt j;//定义一个整型变量j 上面介绍得是我们常用的比较简单的typedef的 ...
- [C/C++]如何解读返回函数指针的函数声明
今天在看<深入理解C++11>的时候,看到一段有意思的代码: int (*(*pf())())() { return nullptr; } 我立刻就懵了——从来没有见过这样的函数声明.那么 ...
- C/C++回调方式系列之一 函数指针和函数回调模式
一.函数指针 1. 函数的定义 return_type function_name(parameter list) { function_body } return_type: 返回值,函数一定有返回 ...
随机推荐
- 第37章 资源所有者密码验证(Resource Owner Password Validation) - Identity Server 4 中文文档(v1.0.0)
如果要使用OAuth 2.0资源所有者密码凭据授权(aka password),则需要实现并注册IResourceOwnerPasswordValidator接口: public interface ...
- DSAPI多功能组件编程应用-参考-Win32API常数
DSAPI多功能组件编程应用-参考-Win32API常数 在编程过程中,常常需要使用Win32API来实现一些特定功能,而Win32API又往往需要使用一些API常数,百度搜索常数值,查手册,也就成了 ...
- Nunit的尝试
(ps:没有代码,只有理论) 单元测试 单元测试(Unit Test)的一个测试用例(Test Case)是一小段代码,用于测试一个小的程序功能的行为是否正常,保证开发的功能子项能正确完成并实现其基本 ...
- Java开发笔记(二十四)方法的组成形式
经过前面的学习,我们发现演示的Java代码越来越复杂,而且每个例子的代码都堆在入口方法main内部,这会导致如下问题:1.一个方法内部堆砌了太多的代码行,看着费神,维护起来也吃力:2.部分代码描述的是 ...
- 零基础学Python--------第2章 Python语言基础
第2章 Python语言基础 2.1 Python语法特点 2.11注释 在Python中,通常包括3种类型的注释,分别是单行注释.多行注释和中文编码声明注释. 1.单行注释 在Python中,使用 ...
- C#网络请求与JSON解析
最新学校的海康摄像头集控平台(网页端)不能在win10里登录,我寻思着拿海康的c# demo直接改. 首先得解决权限问题,每个教师任教不同年级,只能看到自己所在年级的设备,涉及到登录,在此记录一下C# ...
- 散列表(has table、哈希表)
一. 散列表是什么 是包含映射关系的一种数据结构,可以提高查找效率. 二. 散列函数 1)必须是一致的.假设输入一个单词“banana”,映射的数字是1,那么以后每次输入banana都要映射到数字1, ...
- Messenger在MVVM模式中的应用
Messenger在MVVM模式中的应用 Messenger在MVVM中应用的前提 我们知道在MVVM架构中,系统平台的Silverlight客户端界面开发和业务逻辑已经被分开,XAML是SL的主要部 ...
- Android为TV端助力 进制互相转换
byte转换为16进制 public static String GetByte2Str(byte b) { byte[] buff = new byte[2]; buff[0] = mHex[(b ...
- 2019Java查漏补缺(一)
看到一个总结的知识: 感觉很全面的知识梳理,自己在github上总结了计算机网络笔记就很累了,猜想思维导图的方式一定花费了作者很大的精力,特共享出来.原文:java基础思维导图 自己学习的查漏补缺如下 ...