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, ...)
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, ×Five); //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++中的虚拟函数。也就是说,您的“对象”可以是带有一组函数指针的结构或数组,然后不同的“类”可以将它们自己的“方法”指针放入这些插槽中。另一个用途是用于事件驱动的“回调”类型的设计。