zoukankan      html  css  js  c++  java
  • 【c++ primer, 5e】函数指针

    简单的示例:

    #include <iostream>
    using namespace std;
    int sum(int x, int y)
    {
        return x + y;
    }
    int main()
    {
        cout << sum(1, 2) << endl;
        int (*pf)(int, int); // 未初始化
        pf = sum;
        cout << pf(3, 4) << endl;
        /* output:
        3
        7
        */
        return 0;
    }

    遇到重载的情况,编译器通过指针类型精确匹配函数。

    #include <iostream>
    using namespace std;
    int sum(int x, int y)
    {
        return x + y;
    }
    int sum(int x, double y)
    {
        cout << "sum2" << endl;
        return x + y;
    }
    int main()
    {
        cout << sum(1, 2) << endl;
        int (*pf)(int, int); // 未初始化
        pf = sum;
        cout << pf(3, 4) << endl;
        /* output:
        3
        7
        */
        return 0;
    }

    将函数作为参数:

    #include <iostream>
    using namespace std;
    int sum(int x, int y)
    {
        return x + y;
    }
    typedef decltype(sum) func;
    int useInt2(int x, int y, func f)
    {
        return f(x, y);
    }
    int main()
    {
        cout << useInt2(3, 4, sum) << endl;
        /* output = 7 */
        return 0;
    }

     返回类型不会自动地转换成指针,我们必须显示地将返回类型指定为指针,但是我想,除非是函数内部还可以构造函数(例如Python那样),否则返回函数也没什么用。

    练习

    6.54

    #include <iostream>
    #include <vector>
    using namespace std;
    int sum(int x, int y)
    {
        return x + y;
    }
    int main()
    {
        using pf = int(*)(int, int);
        vector<pf> pfvec;
        return 0;
    }

     

    6.55 & 6.56

    #include <iostream>
    #include <vector>
    using namespace std;
    int add(int x, int y)
    {
        return x + y;
    }
    int subtract(int x, int y)
    {
        return x - y;
    }
    int multiply(int x, int y)
    {
        return x * y;
    }
    int divide(int x, int y)
    {
        return x / y;
    }
    int main()
    {
        using pf = int(*)(int, int);
        vector<pf> pfvec;
        pfvec.push_back(add);
        pfvec.push_back(subtract);
        pfvec.push_back(multiply);
        pfvec.push_back(divide);
        for (pf f : pfvec) {
            cout << f(12 , 4) << endl;
        }
        return 0;
    }

    输出结果:

    16
    8
    48
    3
  • 相关阅读:
    mysql max_allowed_packet设置及问题
    mybatis之foreach用法
    uniapp编译小程序分包配置
    鼠标点击页面显示文字
    element ui el-date-picker 判断所选时间是否交叉
    前端处理跨域的几种方式
    uniapp的ajax封装请求
    js获取两个时间差
    vue文件下载功能
    nextTick使用
  • 原文地址:https://www.cnblogs.com/xkxf/p/6661472.html
Copyright © 2011-2022 走看看