zoukankan      html  css  js  c++  java
  • function类型(c++11)

    1.c++五大可调用的对象

      可调用的对象常常作为泛型算法的实参

    1)函数

    2)函数指针

    • 函数名其实也是函数指针,只不过函数名是一个常量指针,它的值不能改变,只能指向该函数,不能改变它的值让它指向别的函数
    void fun1(int a)
    {
        cout << a << endl;
    }
    
    void fun2(int a)
    {
        cout << a+10 << endl;
    }
    
    
    int main()
    {
        void(*f)(int);    //f是一个函数指针
        f = fun1;    //将f指向函数fun1()
        f(6);        //输出6
        f = fun2;    //将f指向函数fun2()
        f(6);        //输出:16
    
        (*fun1)(6);        //fun1其实也是函数指针,并且是一个常量指针,它只能指向函数fun1(),不能让它指向别的函数
        fun1 = fun2;    //编译错误:不可以修改常量指针的指向(值)
    
        return 0;
    }

    3)lambda表达式

    4)bind对象

    5)重载了opeartor()运算符的类

    2.可调用的对象的调用形式

    int(int, int)    //此调用形式表示:接受两个int,返回一个int

    3.function类型(c++11)

    1)function类型可以将调用形式相同的可调用对象统一成一种类型

    2)把可调用对象定义成function类型后,可以直接使用function类型来“简化”调用

    3)不能直接将重载的函数名存入function类型的对象中

    int add(int a, int b)
    {
        return a + b;
    }
    
    int add(int a, int b, string s)
    {
        return a;
    }
    
    int main()
    {
        function<int(int, int)> f1 = add;    //编译错误,编译器不知道是哪个add
        int(*fun)(int, int) = add;        
        function<int(int, int)> f2 = fun;    //正确:函数指针fun指向带有两个参数的add()函数
        cout << f2(1, 2) << endl;    //输出3
        function<int(int, int)> f3 = [](int a, int b) {return add(a, b); };    //正确:使用lambda表达式来指定带有两个参数的add()函数
        cout << f3(3, 4) << endl;    //输出7
    
        return 0;
    }

    解决:

    • 使用函数指针来指向某个重载函数
    • 使用lambda表达式来指向某个重载函数
  • 相关阅读:
    C ------ 标准函数介绍
    socket编程 ------ 建立 TCP 服务器和客户端流程(阻塞方式)
    TCP ------ keep-alive
    ARM指令集、Thumb指令集、Thumb-2指令集
    poj万人题
    Codeforces Round #273 (Div. 2)
    bnuoj 34990(后缀数组 或 hash+二分)
    hdu4691(后缀数组)
    simpson公式求定积分(模板)
    acdream1415(dij+优先队列+桥)
  • 原文地址:https://www.cnblogs.com/Joezzz/p/9733318.html
Copyright © 2011-2022 走看看