首页 > 试题广场 >

下面有关回调函数的说法,错误的是?

[单选题]
下面有关回调函数的说法,错误的是?
  • 回调函数一般是一个通过函数指针调用的函数
  • 回调函数可能被系统API调用一次,也可能被循环调用多次
  • 回调函数本身可以直接是全局函数 、静态函数或某个特定类的成员函数
  • 回调函数可用于通知机制
考察点:this指针

核心就是类成员函数需要this指针访问函数,而全局或者静态函数不需要this指针。
简言之,类的成员函数需要隐含的this指针 而回调函数没有办法提供。

基础概念:
      回调函数就是一个通过函数指针调用的函数。
       如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。
       回调函数不是由该函数的实现方法直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。


参考讨论:
http://bbs.csdn.net/topics/380257801
http://baike.baidu.com/view/414773.htm
编辑于 2021-11-16 14:46:49 回复(6)
所谓的回调函数,就是预先在系统的对函数进行注册,让系统知道这个函数的存在,以后,当某个事件发生时,再调用这个函数对事件进行响应。 定义一个类的成员函数时在该函数前加CALLBACK即将其定义为回调函数,函数的实现和普通成员函数没有区别
发表于 2014-11-13 15:26:04 回复(2)
回调函数还真有点像BP机:告诉别人号码,在它有事情时Call您 
回调用于层间协作,上层将本层函数安装在下层,这个函数就是回调,而下层在一定条件下触发回调,例如作为一个驱动,是一个底层,他在收到一个数据时,除了完成本层的处理工作外,还将进行回调,将这个数据交给上层应用层来做进一步处理,这在分层的数据通信中很普遍。 
其实回调和API非常接近,他们的共性都是跨层调用的函数。但区别是API是低层提供给高层的调用,一般这个函数对高层都是已知的;而回调正好相反,他是高层提供给底层的调用,对于低层他是未知的,必须由高层进行安装,这个安装函数其实就是一个低层提供的API,安装后低层不知道这个回调的名字,但它通过一个函数指针来保存这个回调,在需要调用时,只需引用这个函数指针和相关的参数指针。

其实:回调就是该函数写在高层,低层通过一个函数指针保存这个函数,在某个事件的触发下,低层通过该函数指针调用高层那个函数。
发表于 2015-08-05 16:09:16 回复(4)
回调函数不能是特定的类成员函数。因为类成员函数含有this指针。
发表于 2016-05-23 16:49:54 回复(1)
打个比方,有一家旅馆提供叫醒服务,但是要求旅客自己决定叫醒的方法。可以是打客房电话,也可以是派服务员去敲门,睡得死怕耽误事的,还可以要求往自己头上浇盆水。这里,“叫醒”这个行为是旅馆提供的,相当于库函数,但是叫醒的方式是由旅客决定并告诉旅馆的,也就是回调函数。而旅客告诉旅馆怎么叫醒自己的动作,也就是把回调函数传入库函数的动作,称为登记回调函数(to register a callback function)。


作者:桥头堡
链接:https://www.zhihu.com/question/19801131/answer/27459821
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
发表于 2017-03-24 14:32:04 回复(1)
题有问题,回调函数可以通过绑定this指针实现对类成员函数的调用.
发表于 2021-02-04 16:25:18 回复(0)
我们从先准备,后使用的角度来看,就是这样的:
        定义数个函数,他们可以完成不同的功能(这就是所谓的回调函数),为了抽象出一个接口,方便在不同的需求下调用适当的回调函数,我们定义一个叫做中间函数的东西,将回调函数形成的函数指针传进去(作为参数,这也就是所谓的注册(register));接下来就是等待使用了;
我们从使用时调用的角度来看,是这样的:
        主函数在运行过程中,想要完成某种功能了,这时候它调用中间函数,传入的参数就是回调函数的函数名,因为之前已经注册过了,所以,中间函数就可以找到回调函数完成响应;
        有时候,我觉得还是得从知识层面来学习,仅仅看他们说的旅馆服务啊什么的不容易上升高度。
        个人感觉这个回调函数有点多态的意思,中间函数就像一个接口,实现了客户端与实现端的解耦,hhh~
懒得去水印了,凑活看吧

        至于回调函数为什么不能作为类成员函数,是因为:
        回调函数已经在中间函数进行了注册,函数指针的参数已经确定;而类中的成员函数隐含着this指针(作为参数)(实际上,*this就表示传入的对象),这也是为什么不同对象调用某成员函数的时候得到了不同的数据成员(值);将回调函数声明为类成员函数意味着类也为它放了this指针,这就导致了该回调函数的参数与先前注册的不匹配,编译器就不通过了;现学现写,望各位领导批评指正

编辑于 2020-05-17 17:23:56 回复(0)
?垃圾题,成员函数指针了解一下?std::function了解一下?std::bind了解一下?
发表于 2018-08-21 18:04:58 回复(1)
啊,没有讲解嘛。。
发表于 2022-08-29 22:30:43 回复(0)
回调函数不能是成员函数,因为成员函数隐藏this指针,而回调函数无法提供
发表于 2020-05-02 22:13:32 回复(0)
静态成员函数呢😭
发表于 2023-06-02 03:06:41 回复(0)
C错误,因为类的成员函数需要this指针来调用,而回调函数没有this指针。
发表于 2021-12-24 10:32:19 回复(0)
C也是对的,A反而片面
发表于 2021-04-07 22:50:15 回复(0)

回调函数是利用函数指针传递的函数,而类的非静态成员函数都有一个this指针,这样会造成在调用时候的参数不匹配

发表于 2020-03-28 11:18:56 回复(0)
发表于 2018-09-09 14:52:29 回复(0)
基础概念:
      回调函数就是一个通过函数指针调用的函数。
       如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。
       回调函数不是由该函数的实现方法直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

发表于 2018-07-10 10:18:07 回复(0)
转 考察点:this指针 核心就是类成员函数需要this指针访问函数,而全局或者静态函数不需要this指针。 简言之,类的成员函数需要隐含的this指针 而回调函数没有办法提供。 基础概念:       回调函数就是一个通过函数指针调用的函数。        如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。        回调函数不是由该函数的实现方法直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。 参考讨论: http://bbs.csdn.net/topics/380257801 http://baike.baidu.com/view/414773.htm
发表于 2017-09-16 19:14:37 回复(0)
只能是成员函数
发表于 2017-09-02 15:28:07 回复(0)
回调函数就是一个通过函数指针调用的函数。
如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。
回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
发表于 2017-03-04 12:52:28 回复(0)
类成员函数有this
发表于 2016-12-28 21:52:26 回复(0)