C++中各种可调用对象深入讲解分享!

概述

一组执行任务的语句都可以视为一个函数,一个可调用对象。在程序设计的过程中,我们习惯于把那些具有复用性的一组语句抽象为函数,把变化的部分抽象为函数的参数。

函数的使用能够极大的极少代码重复率,提高代码的灵活性。

C++中具有函数这种行为的方式有很多。就函数调用方式而言

func(param1, param2);

这儿使用func作为函数调用名,param1和param2为函数参数。在C++中就func的类型,可能为:

下面就这几种函数展开介绍

简单函数形式

普通函数

这种函数定义比较简单,一般声明在一个文件开头。如下:

  #include <iostream>    // 普通函数声明和定义  int func_add(int a, int b) { return a + b; }    int main()  {    int a = 10;    int b = 20;    int sum = func_add(a, b);    std::cout << a << "+" << b << "is : " << sum << std::endl;    getchar();    return 0;  }

类成员函数

在一个类class中定义的函数一般称为类的方法,分为成员方法和静态方法,区别是成员方法的参数列表中隐含着类this指针。

  #include <iostream>    class Calcu  {  public:    int base = 20;    // 类的成员方法,参数包含this指针    int class_func_add(const int a, const int b) const { return this->base + a + b; };    // 类的静态成员方法,不包含this指针    static int class_static_func_add(const int a, const int b) { return a + b; };  };    int main(void)   {    Calcu obj;    int a = 10;    int b = 20;      // 类普通成员方法调用如下    obj.class_func_add(a, b);      // 类静态成员方法调用如下    obj.class_static_func_add(a, b);    Calcu::class_static_func_add(a, b);      getchar();    return 0;  }

仿函数

仿函数是使用类来模拟函数调用行为,我们只要重载一个类的operator()方法,即可像调用一个函数一样调用类。这种方式用得比较少。

  class ImitateAdd  {  public:    int operator()(const int a, const int b) const { return a + b; };  };    int main()  {    // 首先创建一个仿函数对象,然后调用()运算符模拟函数调用    ImitateAdd imitate;    imitate(5, 10);      getchar();    return 0;  }

函数指针

顾名思义,函数指针可以理解为指向函数的指针。可以将函数名赋值给相同类型的函数指针,通过调用函数指针实现调用函数。

函数指针是标准的C/C++的回调函数的使用解决方案,本身提供了很大的灵活性。

  #include <iostream>    // 声明一个compute函数指针,函数参数为两个int型,返回值为int型  int (*compute)(int, int);    int max(int x, int y) { return x >= y ? x : y; }  int min(int x, int y) { return x <= y ? x : y; }  int add(int x, int y) { return x + y; }  int multiply(int x, int y) { return x * y; }    // 一个包含函数指针作为回调的函数  int compute_x_y(int x, int y, int(*compute)(int, int))  {    // 调用回调函数    return compute(x, y);  }    int main(void)   {    int x = 2;     int y = 5;    std::cout << "max: " << compute_x_y(x, y, max) << std::endl; // max: 5    std::cout << "min: " << compute_x_y(x, y, min) << std::endl; // min: 2    std::cout << "add: " << compute_x_y(x, y, add) << std::endl; // add: 7    std::cout << "multiply: " << compute_x_y(x, y, multiply) << std::endl; // multiply: 10      // 无捕获的lambda可以转换为同类型的函数指针    auto sum = [](int x, int y)->int{ return x + y; };    std::cout << "sum: " << compute_x_y(x, y, sum) << std::endl; // sum: 7      getchar();    return 0;  }

Lambda函数

Lambda函数定义

Lambda函数,又可以称为Lambda表达式或者匿名函数,在C++11中加入标准。定义形式如下:

[captures] (params) -> return_type { statments;}

其中:

需要注意:

下面都是有效的匿名函数定义

  auto func1 = [](int x, int y) -> int { return x + y; };   auto func2 = [](int x, int y) { return x > y; }; // 省略返回值类型  auto func3 = [] { global_ip = 0; }; // 省略参数部分

Lambda函数捕获列表

为了能够在Lambda函数中使用外部作用域中的变量,需要在[]中指定使用哪些变量。

下面是各种捕获选项:

只有lambda函数没有指定任何捕获时,才可以显式转换成一个具有相同声明形式函数指针

  auto lambda_func_sum = [](int x, int y) { return x + y; }; // 定义lambda函数  void (*func_ptr)(int, int) = lambda_func_sum; // 将lambda函数赋值给函数指针  func_ptr(10, 20); // 调用函数指针

std::function函数包装

std::function定义

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/c-cdevelopment/482782.html

(0)
上一篇 2020年11月9日
下一篇 2020年11月9日

精彩推荐