为了账号安全,请及时绑定邮箱和手机立即绑定

函数指针有什么意义?

函数指针有什么意义?

C++ C
慕工程0101907 2019-07-26 15:07:07
函数指针有什么意义?我很难看到函数指针的实用程序。我想它在某些情况下可能是有用的(毕竟它们存在),但我想不出使用函数指针更好或不可避免的情况。你能举出一些好用函数指针的例子(在C或C ++中)吗?
查看完整描述

3 回答

?
饮歌长啸

TA贡献1951条经验 获得超3个赞

大多数示例归结为回调:您调用一个函数f()传递另一个函数的地址g(),并f()调用g()某些特定任务。如果您传递f()h()相反的地址,f()则会回拨h()

基本上,这是一种参数化函数的方法:其行为的某些部分不是硬编码的f(),而是进入回调函数。f()调用者可以通过传递不同的回调函数来使行为不同。经典qsort()来自C标准库,它将其排序标准作为指向比较函数的指针。

在C ++中,这通常使用函数对象(也称为仿函数)来完成。这些是重载函数调用操作符的对象,因此您可以像调用函数一样调用它们。例:

class functor {
  public:
     void operator()(int i) {std::cout << "the answer is: " << i << '\n';}};functor f;f(42);

这背后的想法是,与函数指针不同,函数对象不仅可以携带算法,还可以携带数据:

class functor {
  public:
     functor(const std::string& prompt) : prompt_(prompt) {}
     void operator()(int i) {std::cout << prompt_ << i << '\n';}
  private:
     std::string prompt_;};functor f("the answer is: ");f(42);

另一个优点是,与通过函数指针调用相比,有时更容易内联调用函数对象。这就是为什么在C ++中排序有时比在C中排序更快的原因。


查看完整回答
反对 回复 2019-07-26
?
慕莱坞森

TA贡献1810条经验 获得超4个赞

好吧,我通常在跳转表中使用它们(专业)(另请参阅此StackOverflow问题)。

跳转表通常(但不是唯一地)用于有限状态机中以使它们被数据驱动。而不是嵌套的开关/案例

  switch (state)
     case A:
       switch (event):
         case e1: ....
         case e2: ....
     case B:
       switch (event):
         case e3: ....
         case e1: ....

你可以制作一个2d数组或函数指针,然后调用 handleEvent[state][event]


查看完整回答
反对 回复 2019-07-26
?
皈依舞

TA贡献1851条经验 获得超3个赞

例子:

  1. 自定义排序/搜索

  2. 不同的模式(如战略,观察者)

  3. 回调


查看完整回答
反对 回复 2019-07-26
  • 3 回答
  • 0 关注
  • 1641 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信