函数指针可以方便我们调用函数,但采用函数对象,更能体现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++入门之函数指针和函数对象的更多相关文章

  1. 函数指针玩得不熟,就不要自称为C语言高手(函数指针是解耦对象关系的最佳利器,还有signal)

    记得刚开始工作时,一位高手告诉我说,longjmp和setjmp玩得不熟,就不要自称为C语言高手.当时我半信半疑,为了让自己向高手方向迈进,还是花了一点时间去学习longjmp和setjmp的用法.后 ...

  2. c++学习之初话 函数指针和函数对象 的因缘

    函数指针可以方便我们调用函数,但采用函数对象,更能体现c++面向对象的程序特性. 函数对象的本质:()运算符的重载.我们通过一段代码来感受函数指针和函数对象的使用: int AddFunc(int a ...

  3. 获得函数返回值类型、参数tuple、成员函数指针中的对象类型

    //function_traits.h,获得函数返回值类型.参数tuple.成员函数指针中的对象类型 //参考https://github.com/qicosmos/cosmos/blob/maste ...

  4. Delphi 函数指针(函数可以当参数)

    首先学习: 指向非对象(一般的)函数/过程的函数指针 Pascal 中的过程类型与C语言中的函数指针相似,为了统一说法,以下称函数指针.函数指针的声明只需要参数列表:如果是函数,再加个返回值.例如声明 ...

  5. C#委托与C语言函数指针及函数指针数组

    C#委托与C语言函数指针及函数指针数组 在使用C#时总会为委托而感到疑惑,但现在总新温习了一遍C语言后,才真正理解的委托. 其实委托就类似于C/C++里的函数指针,在函数传参时传递的是函数指针,在调用 ...

  6. Day8 函数指针做函数参数

    课堂笔记 课程回顾         多态 virtual关键字 纯虚函数 virtual func() = 0;         提前布局vptr指针 面向接口编程 延迟绑定 多态的析构函数的虚函数. ...

  7. typedef void (*Fun) (void) 的理解——函数指针——typedef函数指针

    首先介绍大家比较熟悉的typedef int i;//定义一个整型变量i typedef myInt int: myInt j;//定义一个整型变量j 上面介绍得是我们常用的比较简单的typedef的 ...

  8. [C/C++]如何解读返回函数指针的函数声明

    今天在看<深入理解C++11>的时候,看到一段有意思的代码: int (*(*pf())())() { return nullptr; } 我立刻就懵了——从来没有见过这样的函数声明.那么 ...

  9. C/C++回调方式系列之一 函数指针和函数回调模式

    一.函数指针 1. 函数的定义 return_type function_name(parameter list) { function_body } return_type: 返回值,函数一定有返回 ...

随机推荐

  1. ubuntu开发项目不能执行热更新

    当项目开发到一定成熟度,项目基本上比较大(vue,angular,react,java,php等),在Ubuntu系统环境下,我们写了代码,但是不能想Windows一样执行热更新,这是因为Ubuntu ...

  2. Python并发编程之实战异步IO框架:asyncio 下篇(十一)

    大家好,并发编程 进入第十一章. 前面两节,我们讲了协程中的单任务和多任务 这节我们将通过一个小实战,来对这些内容进行巩固. 在实战中,将会用到以下知识点: 多线程的基本使用 Queue消息队列的使用 ...

  3. DSAPI HTTP监听服务端与客户端

    本文中,演示了使用DSAPI.网络相关.HTTP监听,快速建立服务端和客户端. HTTP监听服务端的作用,是监听指定计算机端口,以实现与IIS相同的解析服务,提供客户端的网页请求,当然,这不仅仅是应用 ...

  4. 从零开始学安全(三十八)●cobaltstrike生成木马抓肉鸡

    链接:https://pan.baidu.com/s/1qstCSM9nO95tFGBsnYFYZw 提取码:w6ih  上面是工具 需要java jdk 在1.8.5 以上  实验环境windows ...

  5. 手机端input[type=date]的placeholder不起作用

    <div class="input clearfix"> <label class="fl">起始日期</label> &l ...

  6. 在Dynamics 365中使用SURVEYJS代替对话(Dialog)制作话术

    本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复269或者20180318可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong.me ...

  7. 免费开源ERP Odoo实施指南 连载二:POSTGRESQL概述

    PostgreSQL是Odoo支持的数据库.PostgreSQL是起源于大学的一个历史很长的开源数据库系统.包括美国航天局NASA.德国证券交易中心.中国的平安.腾讯的微信支付.阿里巴巴的阿里云都在用 ...

  8. 【图解】FlexGrid Explorer 全功能问世

    前言 在去年的时候,我们推出了FlexGrid Demo,包含了FlexGrid的常用功能,如分组.滚动.冻结.自定义单元格类型.搜索面板.表格过滤器.树形结构.合并单元等,目前我们又在里面添加很多了 ...

  9. myapp——自动生成小学四则运算题目的命令行程序(侯国鑫 谢嘉帆)

    1.Github项目地址 https://github.com/baiyexing/myapp.git 2.功能要求 题目:实现一个自动生成小学四则运算题目的命令行程序 功能(已全部实现) 使用 -n ...

  10. 微信小程序下拉刷新和上拉加载的实现

    一: 下拉刷新 下拉刷新两个步骤就能实现. 1.在要实现下拉刷新的页面的json配置文件里面加上 "enablePullDownRefresh": true, //开启下拉刷新 & ...