我很难看到函数指针的实用性。我想它在某些情况下可能有用(毕竟它们存在),但我想不出使用函数指针更好或不可避免的情况。 您能否举一些很好地使用函数指针(在 C 或 C++ 中)的例子? 原文由 gramm 发布,翻译遵循 CC BY-SA 4.0 许可协议
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 许可协议
Most examples boil down to callbacks : You call a function
f()
passing the address of another functiong()
, andf()
callsg()
for some具体任务。如果你传递了f()
的地址,那么h()
f()
会回调h()
基本上,这是对函数进行 参数化 的一种方法:其行为的某些部分没有硬编码为
f()
,而是写入回调函数。调用者可以通过传递不同的回调函数使f()
表现不同。一个经典是qsort()
来自 C 标准库,它将其排序标准作为指向比较函数的指针。在 C++ 中,这通常使用 函数对象(也称为函子)来完成。这些是重载函数调用运算符的对象,因此您可以像调用函数一样调用它们。例子:
这背后的想法是,与函数指针不同,函数对象不仅可以携带算法,还可以携带数据:
另一个优点是有时内联对函数对象的调用比通过函数指针调用更容易。这就是为什么在 C++ 中排序有时比在 C 中排序更快的原因。