首页 > 编程语言 >c++ function

c++ function

时间:2024-02-06 19:35:07浏览次数:17  
标签:function 函数 对象 bind 捕获 c++ 参数 变量

可调用对象

  • 函数
  • 函数指针
  • 函数类
  • lamda表达式
  • bind对象

函数类

重载了函数调用运算符()的类的对象,称为函数对象。

class callable
{
public:
    void operator() (int x) const
    {
        cout << "callable::operator(): " << x << endl;
    }
};
int main(){
    callable c;
    c(0);
}

相对于普通函数,函数类可以保存状态,有自己的类型。

lambda表达式

capture mutable exception attribute -> ret

  • capture: 捕获列表,声明外部变量
  • params: 形参列表,可以省略无参数
  • mutable: 是否可以修改捕获的变量,可以省略捕获列表不能修改
  • exception: 异常设定
  • attribute: 属性
  • ret: 返回值类型,可以省略,根据body的return推断
  • body: 函数体

捕获

值捕获

被捕获的变量的值在lambda表达式创建时拷贝,不会受到外部变量的影响,同样,lambda表达式的修改也不会影响外部变量。

int main()
{
    int a = 0;
    auto f1 = [a] () { cout << a << endl; };  // 值捕获
    auto f2 = [&a] () { cout << a << endl; }; // 引用捕获
    auto f3 = [=] () { cout << a << endl; };  // 值捕获
    auto f4 = [&] () { cout << a << endl; };  // 引用捕获
    a++;
    f1();
    f2();
    f3();
    f4();
}
/*
0
1
0
1
*/
引用捕获

捕获的变量就是引用绑定的对象。

隐式捕获

不指定捕获列表,编译器会根据使用的外部变量自动推断捕获方式。

  • [=] 按值捕获
  • [&] 按引用捕获
混合方式

[=, &x] 按值捕获除x外的所有变量,x按引用捕获
[&, x] 按引用捕获除x外的所有变量,x按值捕获

mutable

按值传递时,默认情况下,lambda表达式不能修改捕获的变量,加上mutable关键字后,可以修改捕获的变量,但仍不影响外部变量。

形参

不支持默认参数,不支持可变参数

bind对象

bind可以绑定一个可调用对象和一组参数,返回一个新的可调用对象。

auto newCallable = bind(callable, arg_list);

arglist是参数列表,可以是占位符,也可以是具体的值。占位符_i表示newCallable的第i个参数。
预先绑定的参数通过值传递,占位符参数通过引用传递。
bind绑定类成员函数时,参数依次为成员函数指针(显式使用&,编译器对于成员函数不会自动转换),对象指针,成员函数参数。

std::function

模板类,抽象了函数参数和返回值,以上介绍的所有具有相同参数和返回值的函数对象都可以用同一类std::function表示,从而使用统一的处理方式。
一个例外时不能容纳类成员函数,因为类成员函数有一个隐藏的this指针。
可以推迟函数的执行,经常用于回调函数。

标签:function,函数,对象,bind,捕获,c++,参数,变量
From: https://www.cnblogs.com/wangerblog/p/18010213

相关文章

  • C++编程练习||1.排序函数模板2.函数模板3.重载printArray函数模板
    1.排序函数模板已知主函数如程序后缀代码所示,请为其编写适当的模板函数,使主函数的bubbleSort函数可以对一个整型数组和一个浮点数数组进行输入、排序、输出操作。#include<iostream>#include<iomanip>usingnamespacestd;template<typenameT>voidbubbleSort(T*arr,......
  • 洛谷题单指南-递推与递归-P1464 Function
    原题链接:https://www.luogu.com.cn/problem/P1464题意解读:虽然a、b、c可输入的范围比较大,但是递归中,只会限制在0-20以内,由于递归中有大量的重复计算,因此需要采用记忆化搜索来保存已经计算过的递归函数值。解题思路:定义三位数组LLmem[25][25][25],mem[a][b][c]保存w(a,b,c)的......
  • c++命名空间
    1.命名空间定义注:命名空间只能在全局变量中定义namespacemystd{intx,y;intmax(inta,intb){returnstd::max(a,b);}}intmain(){inta=10,b=4;std::cout<<mystd::max(a,b);}2.命名空间可以嵌套namespacemystd{......
  • DevC++ 支持c++11
    DevC++支持c11报错解决点击工具,选择编译选项勾选编译时加入一下命令-std=c++11......
  • C++(learning)
     模板宏例子,用于创建get()、set()#defineWELD_ATTACH_INFO_SETGET(T,FUN,VAR)\inlineTget##FUN()const{returnVAR;}\inlinevoidset##FUN(Tt){VAR=t;}WELD_THRESHOLD_SETGET(int,InitId,init_id_) 方便引用#ifndefUSE_PLANDATA#defineUSE_PL......
  • Windows下如何使用 Sublime Text 4 配置 C/C++ 环境(使用LSP-clangd)
    1软件安装1.1SublimeText4安装及PackageControl安装略,请自行百度/必应/谷歌。1.2Clang环境安装1.2.1Clang下载在LLVMMinGW下载最新版Clang编译器,此处应根据个人电脑系统及版本选择,本文选择llvm-mingw-20231128-ucrt-x86_64.zip,后续文件名将以此为例。各版本......
  • C++编程练习||实现分数类Fraction1、实现分数的+,-,*,/ 2、逻辑运算==、!=、<、<=、>、>
    题目:实现分数类Fraction  classFraction{   intnumerator,denominator;   public:   ....  };  要求:1、实现分数的+,-,*,/2、逻辑运算==、!=、<、<=、>、>=6种运输符号。3、实现输出<<,输入 >>操作符重载。  样例1输入:   12 ......
  • GPT 中的函数调用(function call)是什么?
    在OpenAIChatGPTAPI和GoogleGeminiAPI中我们可以看到函数调用的功能。这个功能是做什么用的?下面大概讲解。以GoogleGeminiAPI函数调用一节中的内容为例,该章节举了一个例子:大语言模型(LLMs)往往无法进行准确的数学运算。比如说,给Gemini两个数\(a\)和\(b\),让它计......
  • ChessFunctions+ActiveXControl+SharedAddIn三合一【Office和VBA中呈现中国象棋】
    本软件由三个项目构成,各自下载链接如下:ChessFunctions链接:https://pan.baidu.com/s/11pMnmd28nHtpTGCU9rwNHg提取码:1234ChessFunctions的帮助文件链接:https://pan.baidu.com/s/1uxJYx8gOd8sNEBlda3onnA提取码:1234ActiveXControl链接:https://pan.baidu.com/s/1CTLcXlQgZaD1_av......
  • c++的类开发第一篇
    class_1什么是接口?类就是一种公共接口,公众(public)是使用类的程序,交互系统由类对象组成,而接口由编写类的人提供的方法组成。接口让程序员能够编写与类对象交互的代码,从而让程序能够使用类对象。例如,要计算string对象中包含多少个字符,您无需打开对象,而只需使用string类提供的s......