JoeChenzzz

导航

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表达式来指向某个重载函数

posted on 2018-09-30 20:59  JoeChenzzz  阅读(1233)  评论(0编辑  收藏  举报