我正在阅读有关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)的两个函数,并返回一个浮点数。
答案 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
}