cpp: 使用typedef定义函数指针

  • Java在对于oop的封装上面抽象程度非常的高;但是对于函数,java里面的函数或者方法,可以说是非常基础或者低级。纵观java的语言特性,没有对函数有更高程度的封装。
  • 但是,除了在oop方面的抽象,在函数方面,也可以有很高程度的抽象。这一点,在javascript / python / c /c++上面就有所体现。

如果之前没有接触过对于函数的抽象,那么第一次接触会觉得比较难以理解。比如c++中的函数指针的概念,函数指针数组,指向函数指针的数组等,都是不好理解的。

还好c++中提供了自定义类型的方式,也就是typedef。通过typedef,可以把复杂的类型进行封装,以便于理解和使用。

对于typedef函数指针用法,推荐看这篇博客,讲解的非常清楚到位。甚至比《C++ Primer Plus》上面讲解的更清楚透彻。

下面我也来给出我的理解和使用示例:

#include <iostream>

/*
char (*pFun)(int);

char glFun(int a) { ; }

int main() {
    pFun = glFun;
    (*pFun)(2);
    return 0;
}*/


int (*pAdd)(int, int); // 定义函数指针 pAdd , pAdd不是一个函数,而是函数指针

typedef int (*pFunAdd)(int, int); // 定义一个新的类型
// pFunAdd 到底是什么类型呢?是一个函数指针类型,
// 其中被指向的函数是参数为2个int,返回类型为int的函数.

int add(int x, int y);

int sum(int x, int y);

void useArr(pFunAdd arr[], int size);

/**
 * 定义一个新的类型,如同int,char一样,类型名:pFuncUseArr
 */
typedef void (*pFunUseArr)(pFunAdd *arr, int size); // define a type

int main() {
    using namespace std;
    pAdd = add;
    int zz = (*pAdd)(3, 4);

    cout << "zz=" << zz << endl;
    cout << "# # # # # # # # # # # # " << endl;

    pFunAdd funAdd = add;

    int q = funAdd(5, 6);

    cout << "q =" << q << endl;

    cout << "函数指针数组:" << endl;
    pFunAdd arr[3] = {add, add, sum};
    useArr(arr, 3);

    cout << "函数指针-- " << endl;

    pFunUseArr pfu = useArr;

    pfu(arr+1, 2);
    return 0;
}

void useArr(pFunAdd arr[], int size) {
    int a = 3;
    int b = 4;
    using namespace std;
    for (int i = 0; i < size; ++i) {
        pFunAdd pf = arr[i];
        cout << "i=" << i << " , pf=" << pf
             << ":\t" << pf(a, b) << endl;
    }

}

int add(int x, int y) {
    return x + y;
}

int sum(int x, int y) {

    return x * x + y * y;
}

输出如下:

zz=7
# # # # # # # # # # # # 
q =11
函数指针数组:
i=0 , pf=1: 7
i=1 , pf=1: 7
i=2 , pf=1: 25
函数指针-- 
i=0 , pf=1: 7
i=1 , pf=1: 25

Process finished with exit code 0

可以看到如果要定义一个对应函数为int add(int,int);的函数指针的方式为:typedef int (*pFunAdd)(int, int);,通过这样一个类型定义,就定义了一个函数指针,然后就可以如同int,char一样去使用了。

pFunAdd funAdd = add; // 定义一个 pFunAdd 类型的变量 funAdd ,并赋值为 add. 
//(add是一个函数名,也就是一个函数指针)
int q = funAdd(5, 6); // 如同使用add 一样去使用 funAdd 就好了。

以上,就是使用typedef去定义函数指针的方式。~

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值