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
  • 相关阅读:
    Linux 下安装配置 JDK7
    win7下virtualbox装linux共享win7文件问题(已测试可用)
    Linix常用命令
    JAVA命令大全
    virtualbox 不能为虚拟电脑打开一个新任务/VT-x features locked or unavailable in MSR.
    VirtualBox下安装rhel5.5 linux系统
    redhat RHEL 5.5 下载地址
    ios开发@selector的函数如何传参数/如何传递多个参数
    U盘10分钟安装linux系统
    史上最浅显易懂的Git分布式版本控制系统教程
  • 原文地址:https://www.cnblogs.com/xkxf/p/6661472.html
Copyright © 2011-2022 走看看