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

时间:2010-11-15 13:50:31

标签: c++ c function-pointers

我正在阅读有关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
}


注意:Plus和Minus是param(float,float)的两个函数,并返回一个浮点数。

6 个答案:

答案 0 :(得分:16)

GetPtr1是一个函数,它接受一个操作码char并返回一个指向函数的指针。它返回的函数需要两个浮点数并返回一个浮点数。

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

typedef float (*FloatOperationFuncPtr) (float, float);

FloatOperationFuncPtr GetPtr1(const char opCode)
{
    if(opCode == '+')
        return &Plus;
    else
        return &Minus; // default if invalid operator was passed
}

答案 1 :(得分:10)

阅读毛茸茸的声明的规则是从最左边的标识符开始,然后解决问题,记住()[]绑定*之前(即*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,因此函数的声明/定义是

int *f() { ... }

现在假设我们有一个函数f1,它返回一个指向上面定义的函数f的指针,我们希望通过调用f1来访问该整数值。我们需要调用f1,解析结果(函数f)并执行它,然后取消引用 结果(因为f返回一个指针):

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

表达式的类型 *(*f1())()int,因此f1的decaration / definition必须为

int *(*f1())() { return f; }

答案 2 :(得分:5)

总是很高兴了解http://cdecl.org这种情况。请注意,只有删除参数名称才能使用它。这就是float(*GetPtr1(const char ))(float, float)所获得的:

  

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

答案 3 :(得分:3)

这是一个函数,它接受const char并返回指向float, float并返回float的函数的指针。

答案 4 :(得分:2)

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

答案 5 :(得分:1)

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

typedef float(*Func)(float, float);


Func GetPtr1(const char opCode)
{
    if(opCode == '+')
        return &Plus;
    else
        return &Minus; // default if invalid operator was passed
}