函数指针的意义何在?

新手上路,请多包涵

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

您能否举一些很好地使用函数指针(在 C 或 C++ 中)的例子?

原文由 gramm 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 373
1 个回答

Most examples boil down to callbacks : You call a function f() passing the address of another function g() , and f() calls g() for some具体任务。如果你传递了 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 中排序更快的原因。

原文由 sbi 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题