函数指针如何工作?

时间:2010-12-25 00:09:27

标签: c++ c pointers function-pointers

我在问一些具体问题。

  1. 如何在课堂上初始化它们?
  2. 如何将函数作为参数传递?
  3. 是否需要在类中声明和定义函数指针?
  4. 对于问题2,这就是我的意思:

    void s(void) {
       //...
    }
    
    void f(function) { // what should I put as type to pass a function as an argument
       //...
    }
    
    f(s);
    

4 个答案:

答案 0 :(得分:24)

要定义函数指针,请使用以下语法:

return_type (*ref_name) (type args, ...)

因此,要定义名为“doSomething”的函数引用,它返回int并接受int参数,您可以这样写:

int (*doSomething)(int number);

然后您可以将引用分配给这样的实际函数:

int someFunction(int argument) {
   printf("%i", argument);
}

doSomething = &someFunction;

完成后,您可以直接调用它:

doSomething(5); //prints 5

因为函数指针本质上只是指针,所以你确实可以将它们用作类中的实例变量。

当接受函数指针作为参数时,我更喜欢使用typedef而不是使用函数原型中的混乱语法:

typedef int (*FunctionAcceptingAndReturningInt)(int argument);

然后,您可以使用此新定义的类型作为函数的参数类型:

void invokeFunction(int func_argument, FunctionAcceptingAndReturningInt func) {
   int result = func(func_argument);
   printf("%i", result);
}

int timesFive(int arg) {
   return arg * 5;
}
invokeFunction(10, &timesFive); //prints 50

答案 1 :(得分:2)

它不是严格答案,但是要将可配置/可分配代码作为类成员包含,我会提到使用带有operator()的类/结构。例如:

struct mycode
{
    int k;

    mycode(int k_) : k(k_)
    {
    }

    int operator()(int x)
    {
     return x*k;
    }
};


class Foo
{
public : Foo(int k) : f(k) {}
public : mycode f;
};

你可以这样做:

Foo code(5);
std::cout << code.f(2) << std::endl;

它将打印'10',我写的一切都好。

答案 2 :(得分:1)

您必须以这种方式声明f

void f(void (*x)())
{
  x();  // call the function that you pass as parameter (Ex. s()).
}

here是一个关于函数指针和回调的优秀教程。

答案 3 :(得分:0)

要回答第3个问题,您不必在课堂上声明它。但是不要违反封装,我通常更喜欢成员函数指针或仿函数,而pointees又是类的成员。上面的示例是除了Luis G. Costantini R之外的C样式函数指针。您可以查看this的成员函数指针方法。通常考虑C样式函数指针,例如,回调机制,其中存在接收异步消息的C代码。在这种情况下,没有选项而不是在全局范围内声明处理程序方法。