马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
格式
- int (*fcnPtr)(); // fcnPtr 是一个指向函数的指针,该函数参数为空,返回值为int。
- int (*const fcnPtr)();
复制代码 留意此中影响优先级序次的()不能省略,否则会变为int *fcnPtr(); 体现一个函数的声明,该函数参数为空,返回值为int*
用法
赋值和调用
- #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;
- }
复制代码 留意函数指针的参数和返回值范例必须和原函数划一
- // 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
复制代码 作为函数参数
- void selectionSort(int* array, int size, bool (*comparisonFcn)(int, int))
复制代码 can be equivalently written as:
- void selectionSort(int* array, int size, bool comparisonFcn(int, int))
复制代码 利用alias简化
- using
- using ValidateFunction = bool(*)(int, int);
复制代码 From- bool validate(int x, int y, bool (*fcnPtr)(int, int)); // ugly
复制代码 To- bool validate(int x, int y, ValidateFunction pfcn) // clean
复制代码 - std::function
- #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
复制代码
- using ValidateFunctionRaw = bool(*)(int, int); // type alias to raw function pointer
- using ValidateFunction = std::function<bool(int, int)>; // type alias to std::function
复制代码 简化后的赋值调用
- 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/
|