将函数作为参数传递的意义

时间:2015-05-29 02:46:22

标签: c++

我只是学习在c ++中传递一个作为参数的函数, 但我不知道它的意义是什么。

考虑这个例子,

#include <iostream>
using namespace std;

void argumentFunction(int x) {
      cout << x << " is the result.";
}

void myFunction(void (*functionparam) (int), char parameter[80]) {
    cout << parameter;
    (*functionparam)(1);
}

int main() {
    myFunction(&argumentFunction, "I am calling a function with a function.");      
    cin.ignore(80,'\n');
    return 0;
}

为什么我需要将argumentFunction作为myFunction中的参数传递,实际上我可以直接调用它而不传递它:

像这样:

#include <iostream>
using namespace std;

void argumentFunction(int x) {
      cout << x << " is the result.";
}

void myFunction(char parameter[80]) {
    cout << parameter;
    argumentFunction(1);
}

int main() {
    myFunction( "I am calling a function with a function.");        
    cin.ignore(80,'\n');
    return 0;
}

2 个答案:

答案 0 :(得分:7)

一个例子是C标准库函数qsort,它具有签名:

void qsort(void *base, size_t nmemb, size_t size,
    int (*compar)(const void *, const void *));

这允许程序员将任意比较函数传递给现有的排序算法,而不必为每种需要完成的排序编写一个全新的排序函数。

答案 1 :(得分:4)

如果我们采用像C qsort这样的实际示例,它就不知道如何比较您的数据。毕竟,它可能是你正在排序的字符串键,整数,浮点数,指针,组合等。

它知道如何对数据进行排序,但它不知道如何将一个键与另一个键进行比较。因此,传入比较器函数指针会给它丢失拼图,并允许该代码对几乎任何东西进行排序(好吧,除了需要C ++语义的对象,因为它只是在忽略对象的情况下乱洗字节)。

因此函数指针是解耦的有用机制。 qsort与它可能排序的数据类型分离。这也使它非常普遍适用,因为你可以通过传入函数指针来提供它所需的缺失功能。

另一个例子是,您想要为软件构建用户界面。每当软件中的数据发生变化时,都应重新绘制一些视口/画布类型的东西。如果您只是在代码库中数据发生变化的每个部分直接调用重绘函数,那么整个系统中的各种部分都必须耦合到用户界面。

相反,如果系统只是在数据发生变化时调用一个或多个函数指针,则底层系统不必直接耦合到用户界面中的任何内容(还允许您将用户界面换成更新的用户界面)更时尚而不破坏那种逻辑)。这有点像向世界传达一个信号,说:“我已经改变了!”没有关心谁在听,我们可以传递适当的函数指针来确定在这类事件的情况下该怎么做。

使用C ++,你有更灵活的概念,比如虚函数,使用它们的函数,使用模板的函数对象,可以使用模板抽象地通过静态多态来捕获特定函数对象类型的概念,使用不具有动态多态性的东西需要模板然后使用,等等。但它基本上是相同的想法。