『C++』回调函数

本文介绍了回调函数的定义,即如何将普通函数作为参数传递,以实现函数间的互相调用。以C++ sort算法为例,展示了如何使用回调函数定义自定义排序规则。总结了回调函数在增强代码灵活性和可扩展性上的优势,体现了泛型编程思想。
摘要由CSDN通过智能技术生成

目录

定义

使用

总结


定义

        其实回调函数本质和普通函数一样,只是调用的方式不同。回调函数(函数指针)主要用做普通函数的参数。被调用时,该函数才是回调函数(可使用lambda表达式传入,lambda详见 『C++11』lambda表达式_顽張先生的博客-CSDN博客),大多数情况,该函数也可以像普通函数一样调用。这里我们可能会想,为什么要把一个函数(A)作为参数传进另一个函数(B)呢,为和不在函数(B)中直接调用函数(A)呢。其实将函数指针作为参数的作用和普通变量做参数的意义一致,在函数定义变量,那么该变量的值会由函数中的操作决定,而由参数传递进来的可以由调用函数者决定。

void test_1(int a ) //可以在使用该函数时,自由传入a需要的值

{

    int b  = 10;//b的值一旦在程序的编写时确定,后面就需要通过其他手段来修改
    
    std::cout<<"a+10"<<a+10<<std::endl;    
    std::cout<<"b+10"<<b+10<<std::endl;
        
}

和回调函数做参数的道理一致,在函数中调用其他函数,这样程序可扩展性不强,也就是说,调用该函数时,会固定的调用特定函数,使用回调函数可以增强函数的泛性。


 

使用

 以C++算法库中的排序sort算法来讲,sort是C++定义的一个模板,其排序规则由程序员自行定义。

这是C++底层对sort函数的定义:


  template<typename _RandomAccessIterator, typename _Compare>
    inline void
    sort(_RandomAccessIterator __first, _RandomAccessIterator __last,
	 _Compare __comp)
    {
      __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
	    _RandomAccessIterator>)
      __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
	    typename iterator_traits<_RandomAccessIterator>::value_type,
	    typename iterator_traits<_RandomAccessIterator>::value_type>)
      __glibcxx_requires_valid_range(__first, __last);
      __glibcxx_requires_irreflexive_pred(__first, __last, __comp);

      std::__sort(__first, __last, __gnu_cxx::__ops::__iter_comp_iter(__comp));
    }

1.定义自己的排列规则

static inline bool campare_Armor_area(const Output &result1, Output  &result2)
 {
     return result1.area < result2.area;//对装甲板的大小进行排序
 }

2.将我们需要排序的容器片段,排列顺序的定义函数名作为函数指针传入sort函数

sort(result.begin(), result.end(), campare_Armor_area);//对装甲板的面积从小到大排序排列

可以看出,在sort函数被调用时,就会对campare_Armor_area进行调用,得到一个判断。在调用时,campare_Armor_area还需要反过来对sort调用,以得到容器result中的值。

所以说sort调用了campare_Armor_area,而campare_Armor_area又调用了sort给它的容器信息。它们相互调用。这就是“回调”这两个字的含义!

总结

回调函数其实就是将一个函数指针作为参数进行调用。在日常写代码中,使用回调函数可以让我们的代码可可重写性更强,拓展性更强,这也就符合了C++泛性编程的概念。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值