C++ 函数指针是如何工作的?

C++ 函数指针是如何工作的?,c++,c,pointers,function-pointers,C++,C,Pointers,Function Pointers,我在问一些具体的问题 如何在类中初始化它们 如何将函数作为参数传递 函数指针是否需要在类中声明和定义 对于问题2,我的意思是: void s(void) { //... } void f(function) { // what should I put as type to pass a function as an argument //... } f(s); 要定义函数指针,请使用以下语法: return_type (*ref_name) (type args, ...)

我在问一些具体的问题

  • 如何在类中初始化它们
  • 如何将函数作为参数传递
  • 函数指针是否需要在类中声明和定义
  • 对于问题2,我的意思是:

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

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

    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
    

    您必须以这种方式声明
    f

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

    是关于函数指针和回调的优秀教程

    这不是严格的答案,但要将可配置/可分配代码作为类成员包括在内,我要提到的是使用带有操作符()的类/结构。例如:

    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;
    
    Foo代码(5);
    
    要回答第三个问题,您不必在类中声明它。但为了不违反封装,我通常更喜欢成员函数指针或函子,因为指针对象又是类的成员。上面的例子是C风格的函数指针,但Luis G.Costantini R除外。您可以看看成员函数指针方法。通常会考虑C风格的函数指针,例如,回调机制,其中存在接收异步消息的C代码。在这种情况下,除了在全局范围中声明处理程序方法外,没有其他选项

    你不需要获取函数的地址。@路易斯G. CasTANTIN R:你需要对成员指针(C++ 14822003,C++标准5.3.1/3)的<代码>和>代码>。我个人在所有情况下都使用
    &
    来表示我实际上在传递函数指针。@sil3nt:在标准库中algorithms@sil3nt:函数指针是在C兼容的公共API中使用回调函数的方法。然而,在C++模块中,指向具有适当虚函数的抽象类的指针更灵活。@在C中,可以使用函数指针模拟C++中的虚拟函数。也就是说,您的“对象”可以是带有一组函数指针的结构或数组,然后不同的“类”可以将它们自己的“方法”指针放入这些插槽中。另一个用途是用于事件驱动的“回调”类型的设计。