• 【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
  • 相关阅读:
    Struts2框架中使用Servlet的API示例
    struts2 过滤器和拦截器的区别和使用
    Struts2框架的概述及学习重点
    source .bashrc 报错:virtualenvwrapper.sh: There was a problem running the initialization hooks.
    SE93 创建参数事务
    SM30 客户端 有“不可修改”的状态
    CO借贷标识及转换
    Ubuntu install 错误 E:Unable to locate package
    0CO_PC_01 成本对象控制: 计划/实际数据
    SAP函数PREPARE_STRING:提取字符串中的数字
  • 原文地址:https://www.cnblogs.com/xkxf/p/6661472.html
Copyright © 2020-2023  润新知