文章目录
格式
c++
int (*fcnPtr)(); // fcnPtr 是一个指向函数的指针,该函数参数为空,返回值为int。
int (*const fcnPtr)();
注意其中影响优先级顺序的()不能省略,否则会变为
int *fcnPtr();
表示一个函数的声明,该函数参数为空,返回值为int*
用法
赋值和调用
c++
#include <iostream>
using namespace std;
int goo()
{
cout << 1 << endl;
return 0;
}
int goo2()
{
cout << 2 << endl;
return 0;
}
int foo(int x)
{
cout << x << endl;
return 0;
}
int main()
{
int (*fcnPtrGoo)() { &goo }; // 赋值 (&可省略,支持隐式转换)
fcnPtrGoo(); //调用
fcnPtrGoo = &goo2; // 赋值
(*fcnPtrGoo)(); //调用
int (*fcnPtrFoo)(int) = &foo;// 赋值
fcnPtrFoo(3); //调用
return 0;
}
注意函数指针的参数和返回值类型必须和原函数一致
c++
// function prototypes
int foo();
double goo();
int hoo(int x);
// function pointer initializers
int (*fcnPtr1)(){ &foo }; // okay
int (*fcnPtr2)(){ &goo }; // wrong -- return types don't match!
double (*fcnPtr4)(){ &goo }; // okay
fcnPtr1 = &hoo; // wrong -- fcnPtr1 has no parameters, but hoo() does
int (*fcnPtr3)(int){ &hoo }; // okay
作为函数参数
c++
void selectionSort(int* array, int size, bool (*comparisonFcn)(int, int))
can be equivalently written as:
c++
void selectionSort(int* array, int size, bool comparisonFcn(int, int))
使用alias简化
-
using
c++using ValidateFunction = bool(*)(int, int);
From
c++bool validate(int x, int y, bool (*fcnPtr)(int, int)); // ugly
To
c++bool validate(int x, int y, ValidateFunction pfcn) // clean
-
std::function
c++#include <functional> bool validate(int x, int y, std::function<bool(int, int)> fcn); // std::function method that returns a bool and takes two int parameters
c++
using ValidateFunctionRaw = bool(*)(int, int); // type alias to raw function pointer
using ValidateFunction = std::function<bool(int, int)>; // type alias to std::function
简化后的赋值调用
c++
int main()
{
using FcnPtrGooAlias = int(*)();
FcnPtrGooAlias fcnGoo{ &goo };
fcnGoo();
std::function<int(int)> fcnFoo = &foo;
fcnFoo(2);
return 0;
}
Reference
https://www.learncpp.com/cpp-tutorial/function-pointers/
Foo(2);
return 0;
}
Reference
<https://www.learncpp.com/cpp-tutorial/function-pointers/>