函数指针有什么意义?我很难看到函数指针的实用程序。我想它在某些情况下可能是有用的(毕竟它们存在),但我想不出使用函数指针更好或不可避免的情况。你能举出一些好用函数指针的例子(在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中排序更快的原因。
慕莱坞森
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]
- 3 回答
- 0 关注
- 1641 浏览
添加回答
举报
0/150
提交
取消