代码之家  ›  专栏  ›  技术社区  ›  cheng

关于C++中函数定义的一个问题

  •  13
  • cheng  · 技术社区  · 15 年前

    我正在阅读C++中函数指针的一些材料,并且遇到了一个我不理解的函数定义。
    标准函数定义的形式如下:

    type name (param...)
    

    但是下面的定义对我来说有点奇怪。有人能给我解释一下吗? 谢谢。

    float (*GetPtr1(const char opCode)) (float, float)<br>
    {
        if(opCode == '+')
            return &Plus;
        else
            return &Minus; // default if invalid operator was passed
    }
    


    注意:加号和减号是两个带有param(float,float)和返回float的函数。

    6 回复  |  直到 15 年前
        1
  •  10
  •   John Bode    15 年前

    阅读毛茸茸的声明的规则是从最左边的标识符开始并找出解决方法,记住 () 和 [] 在之前绑定 * (即。, *a[] 是一个指针数组, (*a)[] 是指向数组的指针, *f() 是一个返回指针的函数,并且 (*f)() 是指向函数的指针):

            GetPtr1                                       -- GetPtr1
            GetPtr1(                 )                    -- is a function 
            GetPtr1(           opCode)                    -- taking a single parameter named opCode
            GetPtr1(const char opCode)                    -- of type const char
           *GetPtr1(const char opCode)                    -- and returning a pointer
          (*GetPtr1(const char opCode)) (            )    -- to a function
          (*GetPtr1(const char opCode)) (float, float)    -- taking two parameters of type float
    float (*GetPtr1(const char opCode)) (float, float)    -- and returning float
    

    所以,如果 opCode 等于“+”, GetPtr1 将返回指向函数的指针 Plus ,如果是“-”,则返回指向函数的指针 Minus .

    C和C++声明语法是以表达式为中心的(就像Bjarne想假装的那样);声明的形式应该与表达式中所使用的表达式的形式相匹配。

    如果我们有一个函数 f 返回指向 int 我们要访问被指向的值,执行函数并取消对结果的引用:

    x = *f();
    

    的类型 表达 *f() 是 内景 ,因此函数的声明/定义是

    int *f() { ... }
    

    现在假设我们有一个函数 f1 返回指向函数的指针 f型 上面定义的,我们希望通过调用 一层 . 我们需要打电话 一层 ,取消结果的界限(这是函数 f型 ),然后执行它,然后取消引用 那个 结果(自 f型 返回指针):

    x = *(*f1())(); // *f1() == f, so (*f1())() == f() and *(*f1())() == *f()
    

    的类型 表达 *(*f1())() 是 内景 ,所以 一层 必须是

    int *(*f1())() { return f; }
    
        2
  •  16
  •   Lou Franco    15 年前

    GetPtr1是一个接受操作码字符并返回函数指针的函数。它返回的函数接受两个浮点数并返回一个浮点数。

    很多时候,如果你这样做,阅读起来会更容易:

    typedef float (*FloatOperationFuncPtr) (float, float);
    
    FloatOperationFuncPtr GetPtr1(const char opCode)
    {
        if(opCode == '+')
            return &Plus;
        else
            return &Minus; // default if invalid operator was passed
    }
    
        3
  •  5
  •   Björn Pollex    15 年前

    总是很高兴知道 http://cdecl.org 在这种情况下。请注意,只有删除参数名时,它才起作用。这就是你得到的 float(*GetPtr1(const char ))(float, float) :

    声明 GetPtr1 作为功能 (const char) 返回指向函数的指针 (float, float) 返回 float

        4
  •  3
  •   Ignacio Vazquez-Abrams    15 年前

    这个函数需要 const char 并返回指向函数的指针 float, float 并返回 float .

        5
  •  2
  •   Mark Byers    15 年前

    这意味着一个函数接受一个字符并返回指向接受两个浮点并返回一个浮点的函数的指针。

        6
  •  1
  •   Simone    15 年前

    GetPtr1是一个函数,它接受两个浮点作为输入参数并返回指向函数的指针。更清楚的是:

    typedef float(*Func)(float, float);
    
    
    Func GetPtr1(const char opCode)
    {
        if(opCode == '+')
            return &Plus;
        else
            return &Minus; // default if invalid operator was passed
    }
    
    推荐文章