【问题标题】:What are the advantages of using pointers to function?使用指针函数有什么好处?
【发布时间】:2012-05-22 22:33:04
【问题描述】:

使用指向函数的指针而不是函数本身的真正好处是什么?它是否使执行更快?或者当它被传递给另一个函数时它是否提供了便利?

【问题讨论】:

  • 您使用的是C 还是C++?由于您添加了标签visual-c++,我添加了C++标签。
  • @Griwes 我只是在问什么时候指向函数的指针是有利的
  • @Ghost,“使用指向函数的指针而不是那些函数本身”意味着您不知道它们之间的基本区别-您在编译时“使用函数”并在运行时使用指向它们的指针。没有“优势”或“劣势”——它们在不同的情况下使用,所以用这种方式比较它们是没有意义的。
  • @Griwes:我认为你在这里有点苛刻。 Ghost 本质上要问的是在什么情况下可以使用函数指针。这是一个合理的问题。当然,在 C++ 中,我们有运行时多态性,这意味着虚拟函数可以在运行时决定,因此您的声明您在编译时“使用函数” 并不总是正确的。当然,函数指针是一种非常宝贵的工具,但有时它们会被误用或过度使用,而多态方法本来可以很好地工作。
  • @Griwes 好吧,如果它在我的书中,你认为我会在这里再问一遍吗?

标签: c++ visual-c++ function-pointers


【解决方案1】:

它使您能够在运行时“选择”业务逻辑的一个组件——与硬编码函数名称形成对比,这限制了您在编译时选择要使用的函数。

【讨论】:

  • 这实际上是人们在 C 中做聪明事情的方式。在 c++ 中,有一个多态性
【解决方案2】:

在某些情况下您必须使用函数指针,没有其他方法。比如要实现一个callback函数,指定比较函数(sorting routines中的最后一个参数)。

编辑:如注释中所述,这是关于 C 的。函数指针来自 C。

【讨论】:

  • 你不能在 C++ 中使用函数引用吗?我对 C++ 的经验有限,所以我不知道这是否可能。
  • 对不起,我也不确定 C++ 函数参考。函数指针来自 C 语言,在 C 语言中,在这些情况下没有其他选择。
  • 当然可以,但是这个问题被标记为 C++。而且我知道在 C++ 中你经常想要使用引用而不是指针。如果你不知道,我不希望你回答。但也许其他人可以。
  • @onemasse,OP 正在询问指向函数的指针,我的回答提供了有关它们可能有用的信息。我怀疑 OP 是否在询问指针和引用之间的区别。接受的答案和有问题的评论也表明 OP 正在寻找此类信息。你能解释一下你所说的函​​数引用是什么意思吗?
  • @onemasse:不,您不能使用函数引用。引用在第一次创建值时绑定,不能解除绑定。回调通常是您希望能够更改,或者根本不注册(因此为NULL,引用也不能)。
【解决方案3】:

函数指针是您将函数存储在变量中并将它们传递给其他函数的方式。与“常规功能”相比,没有“优势”,它们是完全不同的东西,试图比较它们是没有意义的。这就像在问“变量或 if 语句哪个更好?”

函数指针提供了一个原本不可用的功能。

【讨论】:

    【解决方案4】:

    事实上,传递一个函数的指针比调用函数本身要慢一点。但差别如此之小,几乎不会产生任何影响。

    正如 Jon 所说,在某些情况下,当您可以将函数从程序的一部分传递到另一部分时,它会带来更大的灵活性。

    【讨论】:

    • 我看不出为什么调用函数指针而不是常规函数应该更慢。这必须高度依赖于编译器。
    【解决方案5】:

    函数指针用于许多不确定要调用哪个函数的情况。让我们举个例子。你想对数组进行排序。为此,您要编写一个通用的排序函数。现在这个排序函数需要比较数组元素。但是由于数组可以包含任何元素(int、浮点数、字符串、用户定义的类型等),这个排序函数如何比较元素。因此,在这种情况下,您可以将 ordering-determining 函数作为参数传递给此 sort 函数,并据此对数组进行排序。此外,它在其他方面也很有用。假设您要对字符串数组(一串数字)进行排序。您可能希望按数字或字母顺序对其进行排序。

    在这种情况下,当您想对数字进行排序时,您可以传递比较函数,该函数根据转换为 int 的字符串的值进行比较。等等……

    【讨论】:

      猜你喜欢
      • 2017-08-26
      • 2016-08-15
      • 1970-01-01
      • 2010-10-14
      • 1970-01-01
      • 2021-12-23
      • 2013-04-16
      • 1970-01-01
      • 2015-04-28
      相关资源
      最近更新 更多