函数指针有什么意义?

函数指针有什么意义?

我很难看到函数指针的实用程序。我想它在某些情况下可能是有用的(毕竟它们存在),但我想不出使用函数指针更好或不可避免的情况。

你能举出一些好用函数指针的例子(在C或C ++中)吗?


慕工程0101907
浏览 1642回答 3
3回答

饮歌长啸

大多数示例归结为回调:您调用一个函数f()传递另一个函数的地址g(),并f()调用g()某些特定任务。如果您传递f()了h()相反的地址,f()则会回拨h()。基本上,这是一种参数化函数的方法:其行为的某些部分不是硬编码的f(),而是进入回调函数。f()调用者可以通过传递不同的回调函数来使行为不同。经典qsort()来自C标准库,它将其排序标准作为指向比较函数的指针。在C ++中,这通常使用函数对象(也称为仿函数)来完成。这些是重载函数调用操作符的对象,因此您可以像调用函数一样调用它们。例:class&nbsp;functor&nbsp;{ &nbsp;&nbsp;public: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;operator()(int&nbsp;i)&nbsp;{std::cout&nbsp;<<&nbsp;"the&nbsp;answer&nbsp;is:&nbsp;"&nbsp;<<&nbsp;i&nbsp;<<&nbsp;'\n';}};functor&nbsp;f;f(42);这背后的想法是,与函数指针不同,函数对象不仅可以携带算法,还可以携带数据:class&nbsp;functor&nbsp;{ &nbsp;&nbsp;public: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;functor(const&nbsp;std::string&&nbsp;prompt)&nbsp;:&nbsp;prompt_(prompt)&nbsp;{} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;operator()(int&nbsp;i)&nbsp;{std::cout&nbsp;<<&nbsp;prompt_&nbsp;<<&nbsp;i&nbsp;<<&nbsp;'\n';} &nbsp;&nbsp;private: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::string&nbsp;prompt_;};functor&nbsp;f("the&nbsp;answer&nbsp;is:&nbsp;");f(42);另一个优点是,与通过函数指针调用相比,有时更容易内联调用函数对象。这就是为什么在C ++中排序有时比在C中排序更快的原因。

慕莱坞森

好吧,我通常在跳转表中使用它们(专业)(另请参阅此StackOverflow问题)。跳转表通常(但不是唯一地)用于有限状态机中以使它们被数据驱动。而不是嵌套的开关/案例&nbsp;&nbsp;switch&nbsp;(state) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;A: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;switch&nbsp;(event): &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;e1:&nbsp;.... &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;e2:&nbsp;.... &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;B: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;switch&nbsp;(event): &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;e3:&nbsp;.... &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;e1:&nbsp;....你可以制作一个2d数组或函数指针,然后调用&nbsp;handleEvent[state][event]

皈依舞

例子:自定义排序/搜索不同的模式(如战略,观察者)回调
打开App,查看更多内容
随时随地看视频慕课网APP