C++:函数:回调函数:还不懂回调函数来捶我

news2025/1/11 19:58:41

前言

不知道你是否有这样的疑问,我们为什么需要回调函数,直接调用函数不就可以了吗?回调函数到底有什么用?程序员该如何理解回调函数了?

这篇文章就为你解答这些问题,读完这篇文章后,你的编程技术将得到质的提高。

同步调用

做一件事情,程序员传统并且最熟悉思维模式一般是这样:

  • 调用某个函数,获取结果
  • 处理获取到的结果

result = request()

handles(result)

 如果 request()函数是同步调用,只有request()函数返回拿到结果后,才能调用handle函数进行处理,request()函数返回前我们必须等待,这就是同步调用,控制流程就是这样的

 异步调用

但是如果我们想更加高效的话,那么就需要异步调用了,我们不去直接调用handle函数,而是作为参数传递给 request()

request(handle)                                                                                          

所以,我们根本不关心request什么时候真正的获取结果,这是request该关心的事情,我们只需要把获取到的结果,该怎么处理告诉request就可以了,因此 request函数可以立即返回,真正获取结果是可能在另一个线程,进程,甚至另一台机器上完成,这就是异步调用。

 

 从编程思维上看,异步调用和同步有很大的差别,如果我们把处理流程当做一个任务来的话,那么同步流程下,整个任务都是我们实现的,但是异步流程情况下:任务的处理流程被分为两部分:

  1. 第一部分,我们处理,也就是调用 request函数之前的部分。
  2. 第二部分:不是我们处理的,而是在其他线程、进程或者另一台机器完成

重点来了:

  第二部分的调用不在我们控制范围内,同时只有调用方才知道该做什么,什么时候调用,因此在这种情况下,就需要一种必要的机制-------》这个机制就是回调。

  1. 在java/Android中,我们通常定义一个接口,然后我们实现这个接口,将接口类型作为参数传给服务方,然后服务方自己决定什么时候去调用这个接口的函数(这个接口函数是我们客户端实现的).
  2. 在C++中没有Java这种类似的接口函数回调,但是C++中有函数指针这个概念,它可以做为参数传给服务端,同样也可以起到和 java类似的功能效果。

回调函数正式定义

回调函数就是一个函数和其他函数没有任何区别。

一般函数:我们自己编写函数会在自己的程序内调用,也就是说函数的编写放方式我们自己,调用方也是我们自己

回调函数:编写方是我们自己,但是函数调用方不是我们,而是我们引用的其他模块,也就是三方库,我们调用第三方库中的函数,并把回调函数传递给第三方库,第三方库中的函数调用我们编写的函数。

 回调函数实际应用:(回调函数作为事件处理函数)

  • 如上图所示:我们抽象出这样一个模型:主应用程序--------库函数--------回调函数。库函数是不知道某个节点(或者业务完成之后在去做什么)。
  • 例如接收到 网络数据、文件读取完成之后,该做什么这些只有库的使用者才知道,设计编写库的作者并不知道,也无法针对主应用程序编写具体代码,只能对外提供一个回调函数(声明一个回调函数),库的使用方来实现该函数(定义该函数),库在特定的时机,特定的节点回调该函数就可以了。
  • 我们在抽象一下:如果把接收网络数据,文件读取看做是事件也就是 event, 那么本质上我们编写的回调函数就是用来处理Event的,因此从这个角度看回调函数不过就是 event handler ,因此回调函数天然适用于 事件驱动编程 event--driven 。

同步回调

  1. 这种回到就是常说的同步回调 synchronous callbacks 、也有将其称为阻塞式回调 blocking callbacks ,或者什么修饰都没有,就是回调callback ,这是我们最熟悉 的回调方式。
  2. 当我们调用某个函数A并以参数的形式 传入回调函数后,在A返回之前 回调函数会 被执行,也就是 说我们的主程序会等待回调函数执行完成,这就是同步回调。

异步回调 

  1. 不同于同步回调,当我们调用某个函数A并以参数的形式传入回调函数后,A函数立即返回,也就是函数A并不会阻塞我们的主程序,一段时间后回调函数开始被执行,此时我们的主程序可能在忙其他任务,回调函数的执行 和我们主程序的运行同时进行。
  2. 既然我们的主程序和回调函数的执行可以同时发生 ,因此一般情况下,主程序和回调函数的执行位于不同的线程或者进程中。

 这就是所谓的异步回调,asynchronous callbacks ,也有资料称为  deferred callbacks ,名字很形象,延迟回调。

回调对应的编程思维模式

  1. 假设我们向处理某项任务,这项任务需要依赖某项服务S,我们可以将任务的处理分为两部分,调用服务S的前部分 PA ,调用服务S后面部分为 PB。
  2. 常规模式 下,PA和PB都是服务调用方执行,也就是我们自己的主程序执行  PA,等待服务S返回后再执行PB部分。
  3. 回调模式下:PA是服务调用方执行,也就是我们自己 的主程序执行PA,等待服务S返回后,服务S在去调用PB.

回调函数实作

回调函数步骤:

1、定义一个函数(普通函数即可);

2、将此函数的地址注册给调用者;

3、特定的事件或条件发生时,调用者使用函数指针调用回调函数。

// main.cpp


#include<iostream>
// 定义一个函数指针:返回值 int ,需要两个int 类型参数
typedef int (*Ptr)(int, int);

// 2:注册函数
int RegFuncation_add(Ptr pInt, int a, int b) {
	// 调用回调函数
	return pInt(a,b);
}

class OperMath
{
public:
	// 1: 回调函数
	static int add(int a, int b) {
		return a + b;
	}

	// 1: 回调函数
	static int reduce(int a, int b) {
		return a - b;
	}

	// 3: 注册函数
	void RegFuncationCallBack_add(int a, int b) {
		std::cout << RegFuncation_add(add, a, b) << std::endl;
	}

	// 3: 注册函数
	void RegFuncationCallBack_reduce(int a,int b) {
		std::cout << RegFuncation_add(reduce, a, b) << std::endl;
	}
};


int main() {
	OperMath math;
	math.RegFuncationCallBack_add(1, 2);  // 打印:3
	math.RegFuncationCallBack_reduce(2, 1); // 打印:1
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/31380.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

连接肠菌与宿主的桥梁:肠菌代谢物——肠菌功能研究新篇章

人的肠道内寄居着多种微生物&#xff0c;他们统称为肠道菌群。研究表明&#xff0c;肠道菌群失衡会导致多种人体疾病&#xff0c;包括糖尿病、肿瘤、心血管疾病、神经系统疾病等。 那么肠菌是怎么对人产生影响的呢&#xff1f;答案是肠菌产生的代谢物&#xff08;1, 2&#xf…

Vue3+nodejs全栈项目(资金管理系统)——后端篇(一)登录、注册

文章目录初始化创建项目配置跨域配置解析表单数据的中间件安装bodyparser初始化用户路由模块抽离用户路由模块中的处理函数登录注册新建admin表安装并配置mysql模块注册检测表单数据是否合法检测用户名是否被占用对密码进行加密处理bcryptjs插入新用户测试登录根据名字查询用户…

CDH6.3.2处理Zookeeper因未授权访问造成的漏洞

1.zookeeper的基本情况 zookeeper是分布式协同管理工具&#xff0c;常用来管理系统配置信息&#xff0c;提供分布式协同服务。zookeeper官网下载软件包&#xff0c;bin目录下有客户端脚本和服务端脚本。另外还有个工具对理解和使用zookeeper服务非常有用&#xff0c;即zk-ui&am…

文本层次语义元素

html5-文本层次语义元素 第1关_文本层次语义元素相关概念 第2关_文本层次语义元素 编程要求 在右侧编辑器中的Begin - End区域内补充代码&#xff0c;具体要求是&#xff1a; 1.运用HTML5中的语义化元素设计一个文章区(<article>)。 2.文章区中的头部为文章的标题&a…

如何自己开传奇单机架设超详细图文教程

如何自己成为传奇&#xff0c;如何自己搭建传奇非官服&#xff0c;首先下载传奇服务器后&#xff0c;会有两个压缩包&#xff0c;一个用于服务器&#xff0c;一个用于游戏补丁文件 传奇单机设置-GOM引擎的超详细图文教程 版本文件包含.exe&#xff0c;以上文件都不起作用。 …

共享里的文件被删除了怎么办?可尝试这三种恢复方法

共享里的文件被删除了怎么恢复&#xff1f;删除之后就马上去回收站找&#xff0c;可是没回收站里没有怎么办&#xff1f;——来自某xx小伙伴的咨询。如果你也出现同样的疑惑&#xff0c;那么可以尝试下面的三种方法恢复共享里的文件。 方法一、以前的版本恢复 从Windows XP SP…

前端获取ip地址判断国家请求不同baseUrl

项目背景 项目新需求&#xff1a;根据ip地址区分出国内外上网&#xff0c;axios 使用不同的baseurl&#xff0c;上传阿里oss不同bucket 获取ip地址 一、使用js自己获取 使用 RTCPeerConnection.setLocalDescription() WebRTC API pc端没问题&#xff0c;移动端不好使 //获取…

react源码分析:深度理解React.Context

开篇 在 React 中提供了一种「数据管理」机制&#xff1a;React.context&#xff0c;大家可能对它比较陌生&#xff0c;日常开发直接使用它的场景也并不多。 但提起 react-redux 通过 Provider 将 store 中的全局状态在顶层组件向下传递&#xff0c;大家都不陌生&#xff0c;…

第十期|惊!游戏广告主投放十万被骗,推广作弊竟全是虚拟用户

顶象防御云业务情报中心发现&#xff0c;在互联网生态中存在很多灰色的渠道刷量工作室&#xff0c;渠道方通常以低廉的价格通过这些工作室提高广告URL点击量、应用下载激活量、注册量和真实的推广数据提起反馈给广告主结算&#xff0c;但其提供的数据质量和价格一样低廉&#x…

用DevExpress实现基于HTMLCSS的桌面应用程序的UI(一)

DevExpress WinForm拥有180组件和UI库&#xff0c;能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForm能完美构建流畅、美观且易于使用的应用程序&#xff0c;无论是Office风格的界面&#xff0c;还是分析处理大批量的业务数据&#xff0c;它都能轻松胜任…

RabbitMQ的高可用和高可靠

01、什么是高可用机制 所谓高可用&#xff1a;是指产品在规定的条件和规定的时刻或时间内处于可执行规定功能状态的能力。 当业务量增加时&#xff0c;请求也过大&#xff0c;一台消息中间件服务器的会触及硬件&#xff08;CPU,内存&#xff0c;磁盘&#xff09;的极限&#x…

从输入url到页面展现的全过程

作为一道面试经常会问到的题目&#xff0c;看过很多写的很好的博文&#xff0c;整理成自己的笔记 大概来说分为以下几个过程&#xff1a; 输入url地址应用层进行DNS解析应用层生成HTTP请求报文传输层建立TCP连接网络层使用IP协议来选择路线数据链路层实现网络相邻节点间可靠的…

vue-pdf+element实现全屏窗口pdf分页预览,pdf打印实现和解决打印乱码

一.源码 vue-pdf打印实现和乱码解决https://download.csdn.net/download/lucky_fang/85498529 二.全屏窗口打印预览效果 分页预览pdf 窗口采用element窗口模板实现&#xff0c;样式可根据自己喜欢的效果进行修改 Element官方文档 终于可以打印测试了&#xff0c;乱码~&…

【优化求解】粒子群算法求解干扰受限无人机辅助网络优化问题【含Matlab源码 230期】

⛄一、粒子群简介 1 粒子群优化算法 粒子群优化算法( PSO)是指通过模拟鸟群觅食的协作行为,实现群体最优化。PSO是一种并行计算的智能算法,其基本模型如下: 假设群体规模为M,在D维空间中,群体中的第i个个体表示为XD ( xm1,xm2…xm D)T,速度表示为VD ( vm1,vm2…vm D)T,位置( …

聊一聊我对Restful理解

概念 REST原则提倡按照HTTP的语义使用HTTP&#xff0c;如果一个系统符合REST原则&#xff0c;我们就说这个系统是Restful风格的。Restful是Web API设计中非常重要的一个概念&#xff0c;但是很多开发人员对于Restful的理解存在误区。 什么是Restful 在说什么是Restful 之前&…

MES必懂知识,市场需求下的生产管理系统

任何事物的产生和发展都与市场的需求是分不开的&#xff0c;只有当市场需求新生的事物的时候&#xff0c;他才会兴起&#xff0c;有的事物早已经产生&#xff0c;在当时的环境下并未兴起&#xff0c;却在后来才兴盛&#xff0c;这是市场的需求的影响。 MES便是在市场需求下诞生…

高通导航器软件开发包使用指南(9)

高通导航器软件开发包使用指南&#xff08;9&#xff09;8参数说明8.1最小条件参数8.2光学流量数据图8.3光学流量估算数据图8.4光学流量估算图8.5 pos_hold_mode内存8.6体积参数8.7障碍物输出参数8.8速度平滑曲线8参数说明 每辆车必须在适当的位置有运行时参数文件&#xff0c…

How to build several ftp servers on one mac OS

1 How to establish one ftp server locally? I have viewed one article which helps us how to do this on mac OS. You can refer to this link Mac下搭建FTP服务器 please read the tutorial seriously. What I do in the following will be based on it. 2 How to buil…

centos7操作系统开机提示error:file “/boot/grub/i386-pc/normal.mod“ not found

一.问题现象 公司重要业务虚拟机突然业务访问不了&#xff0c;重启操作系统之后发现操作系统启动不了&#xff0c;直接进入救援模式&#xff0c;提示error:file “/boot/grub/i386-pc/normal.mod“ not found&#xff0c;报错截图 二.处理思路 在救援模式下&#xff0c;只有很…

用HTML+CSS做一个简单好看的汽车网页

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…