C++ C++;指向函数的指针,初学者问题
我想问一下C语言中的指针++ 我有一些简单的代码:C++ C++;指向函数的指针,初学者问题,c++,function,pointers,C++,Function,Pointers,我想问一下C语言中的指针++ 我有一些简单的代码: int add(int a, int b){ return a+b; } int runner(int x,int y, int (*functocall)(int, int)){ return (*functocall)(x,y); } 现在,假设我用这种方式调用这些函数: cout<<runner(2,5,&add); CUT> P>我相信第二个调用自动解析到编译器中的第一个调用……< /P> < P>函数将
int add(int a, int b){
return a+b;
}
int runner(int x,int y, int (*functocall)(int, int)){
return (*functocall)(x,y);
}
现在,假设我用这种方式调用这些函数:
cout<<runner(2,5,&add);
<代码> CUT> P>我相信第二个调用自动解析到编译器中的第一个调用……< /P> < P>函数将根据C++标准隐式地转换为指针(4.3/1)。没有区别。但是,这种转换从不适用于非静态成员函数。对于它们,您应该明确地编写
&
没有区别。为了与获取指针的其他方法保持一致,您可以使用&
,但名称本身没有其他含义,因此假定其意思是“获取地址”
它与充当数组第一个元素地址的数组变量名非常相似。这是因为没有像函数这样的对象(就表达式而言),只有指向函数的指针。当你想把函数传递给你的函数时,你唯一能传递的就是指针,所以编译器会为你做这个转换。不,在这种特殊情况下没有区别。任何一个都可以提供函数的地址
注意,在C++中,得到指向成员函数的指针需要使用'&’运算符.< /p> 注意,您可以对函数< /p>进行引用。
int runner(int x,int y, int (&functocall)(int, int)){
return functocall(x,y);
}
现在用&add
调用它将不再有效,因为您试图将函数引用绑定到指针而不是函数。有时,在使用模板时,这一点很明显
template<typename T>
int runner(int x,int y, T &functocall, T otherfunc){
return functocall(x,y) + otherfunc(y, x);
}
模板
int runner(int x,int y,T&functocall,T otherfunc){
返回函数调用(x,y)+其他函数调用(y,x);
}
现在使用
runner(10,20,add,add)
调用它将失败,因为T
试图被推断为函数指针和函数类型(在传递到引用参数时不会衰减指针!)。否,我的意思是编译器解析对函数指针的调用,这实际上是一个语法偏好的问题。有一些被称为函数的对象(就表达式而言):add
就是这样一个对象,它的类型是int(int,int)
。但在许多上下文中,它们会隐式衰减为指向自身的指针。请举例说明函数和指向函数的指针作为表达式项的区别,函数不是对象,而是函数(令人惊讶的xD)。例如void f(){}void(&fr)(=f
之所以有效,是因为f是函数类型的表达式,您将引用绑定到它,而void(&fr)(=&f代码>不起作用,因为&f
是指针类型的表达式。另一个例子-尝试执行sizeof(f)
,注意它失败了,因为函数没有大小。正如@avakar所说,这里f的类型是void()
,add的类型是int(int,int)
template<typename T>
int runner(int x,int y, T &functocall, T otherfunc){
return functocall(x,y) + otherfunc(y, x);
}