c++中的函数指针

文章目录

格式
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简化
  1. 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
  2. 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/>
相关推荐
leluckys几秒前
AI- 一种快速实现MCP服务的方法
开发语言·python
qq_401700415 分钟前
C语言 条件编译宏
c语言·开发语言
写代码的【黑咖啡】8 分钟前
探索 Python 中的 Vaex:高效处理大规模数据的新选择
开发语言·python
无限进步_12 分钟前
【C语言&数据结构】对称二叉树:镜像世界的递归探索
c语言·开发语言·数据结构·c++·git·算法·visual studio
JavaLearnerZGQ15 分钟前
1、Java中的线程
java·开发语言·python
X***078818 分钟前
C语言在嵌入式系统开发中的应用与挑战
c++
小芒果_0130 分钟前
整理归并排序
c++·算法·排序算法·信息学奥赛
松涛和鸣32 分钟前
49、智能电源箱项目技术栈解析
服务器·c语言·开发语言·http·html·php
huwei85338 分钟前
Q打印表格内容类
开发语言·qt
玖剹43 分钟前
队列+宽搜(bfs)
数据结构·c++·算法·leetcode·宽度优先