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/>
相关推荐
xlp666hub7 小时前
Leetcode 第三题:用C++解决最长连续序列
c++·leetcode
会员源码网8 小时前
构造函数抛出异常:C++对象部分初始化的陷阱与应对策略
c++
xlp666hub10 小时前
Leetcode第二题:用 C++ 解决字母异位词分组
c++·leetcode
不想写代码的星星11 小时前
static 关键字:从 C 到 C++,一篇文章彻底搞懂它的“七十二变”
c++
xlp666hub1 天前
Leetcode第一题:用C++解决两数之和问题
c++·leetcode
不想写代码的星星1 天前
C++继承、组合、聚合:选错了是屎山,选对了是神器
c++
不想写代码的星星2 天前
std::function 详解:用法、原理与现代 C++ 最佳实践
c++
樱木Plus4 天前
深拷贝(Deep Copy)和浅拷贝(Shallow Copy)
c++
blasit6 天前
笔记:Qt C++建立子线程做一个socket TCP常连接通信
c++·qt·tcp/ip
肆忆_7 天前
# 用 5 个问题学懂 C++ 虚函数(入门级)
c++