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/>
相关推荐
笑衬人心。4 分钟前
Java 17 新特性笔记
java·开发语言·笔记
序属秋秋秋1 小时前
《C++初阶之内存管理》【内存分布 + operator new/delete + 定位new】
开发语言·c++·笔记·学习
ruan1145142 小时前
MySQL4种隔离级别
java·开发语言·mysql
quant_19863 小时前
R语言如何接入实时行情接口
开发语言·经验分享·笔记·python·websocket·金融·r语言
百锦再7 小时前
详细解析 .NET 依赖注入的三种生命周期模式
java·开发语言·.net·di·注入·模式·依赖
风吹落叶花飘荡8 小时前
2025 Next.js项目提前编译并在服务器
服务器·开发语言·javascript
失败又激情的man8 小时前
python之requests库解析
开发语言·爬虫·python
专注VB编程开发20年8 小时前
常见 HTTP 方法的成功状态码200,204,202,201
开发语言·网络协议·tcp/ip·http
有没有没有重复的名字8 小时前
线程安全的单例模式与读者写者问题
java·开发语言·单例模式
十秒耿直拆包选手9 小时前
Qt:主窗体(QMainwindow)初始化注意事项
c++·qt