C++学习笔记(三十五):c++ 函数指针及lambda表达式

本节介绍c++函数指针。在一些源码中经常能看到c++函数指针,但之前一直觉着这一块比较复杂,就一直没去仔细研究,终于有时间去仔细研究这一块内容了。

  • c风格的函数指针
  • 函数指针是指将一个函数赋值给一个变量的方法,可以将函数作为一个参数传递给另一个函数,简单的使用示例如下
  • #include <iostream>
    
    void PrintMessage()
    {
    	std::cout << "Hello World!" << std::endl;
    }
    
    int main()
    {
    	//一般情况下调用函数的方式
    	//PrintMessage();
    
    	//函数指针
    	//取一个函数的地址赋值给一个变量
    	auto function = PrintMessage;  //不加()
    	//函数就是cpu指令,当编译完成代码后,函数处在二进制文件的某个地方
    	//赋值给一个变量后可以向之前调用函数一样调用
    	function();
    	function(); //打印 "Hello World!"
    
    	std::cin.get();
    }
  • 上述示例中是通过auto来接收,接下来看一下PrintMessage具体的返回值类型。
  • #include <iostream>
    
    void PrintMessage()
    {
    	std::cout << "Hello World!" << std::endl;
    }
    
    int main()
    {
    	//一般情况下调用函数的方式
    	//PrintMessage();
    
    	//函数指针
    	//取一个函数的地址赋值给一个变量
    	auto function = PrintMessage;  //不加()
    	//函数就是cpu指令,当编译完成代码后,函数处在二进制文件的某个地方
    	//赋值给一个变量后可以向之前调用函数一样调用
    	function();
    	function(); //打印 "Hello World!"
    
    	//实际PrintMessage返回的类型是void(*function)()
    	//实际的类型是void(*)(),最后一个括号里面的放的是函数的参数类型,function是我们给这个返回类型起的名字
    	void(*pcop)();
    	pcop = PrintMessage;
    	pcop();//打印 "Hello World!"
    
    	//上述的void(*pcop)()可以使用typedef,将别名写在如下位置,看起来可能有点奇怪,但确实是这样的
    	typedef void(*testFunctionPoint)();
    
    	testFunctionPoint heiheihei = PrintMessage;
    	heiheihei();//打印 "Hello World!"
    
    	std::cin.get();
    }
  • 接下来展示函数指针的函数包含参数的示例
  • #include <iostream>
    
    void PrintMessage(int a)
    {
    	std::cout << "Hello World! " << a <<std::endl;
    }
    
    int main()
    {
    	//一般情况下调用函数的方式
    	//PrintMessage();
    
    	//函数指针
    	//取一个函数的地址赋值给一个变量
    	auto function = PrintMessage;  //不加()
    	//函数就是cpu指令,当编译完成代码后,函数处在二进制文件的某个地方
    	//赋值给一个变量后可以向之前调用函数一样调用
    	function(1);
    	function(2); //打印 "Hello World!"
    
    	//实际PrintMessage返回的类型是void(*function)()
    	//实际的类型是void(*)(),最后一个括号里面的放的是函数的参数类型,function是我们给这个返回类型起的名字
    	void(*pcop)(int);
    	pcop = PrintMessage;
    	pcop(5);//打印 "Hello World!"
    
    	//上述的void(*pcop)()可以使用typedef,将别名写在如下位置,看起来可能有点奇怪,但确实是这样的
    	typedef void(*testFunctionPoint)(int);
    
    	testFunctionPoint heiheihei = PrintMessage;
    	heiheihei(6);//打印 "Hello World!"
    
    	std::cin.get();
    }
  • 上述描述的都是函数指针的原理,接下来大概展示函数指针的使用场景。
  • #include <iostream>
    #include <vector>
    void PrintValue(int value)
    {
    	std::cout << value << std::endl;
    }
    
    void ForEach(const std::vector<int>& values, void(*func)(int))
    {
    	for (int value:values)
    	{
    		func(value);
    	}
    }
    
    int main()
    {
    	std::vector<int> values = {1,4,6,7,9};
    	//创建一个函数,迭代遍历values中的所有元素,并将值进行打印
    	ForEach(values, PrintValue);
    
    	std::cin.get();
    }
  • c++lambda表达式
  • lambda表达式是指用一种匿名函数的创建函数,用这种方式创建函数不需要实际创建一个函数。只要有一个函数指针,都可以使用lambda。接下来通过代码展示lambda。
  • 上述的代码展示的是用lambda替换上节所讲述的PrintValue函数指针。()中传入的是lambda的{}中所需的参数,上述的func(value)实际上调用就是[](int value){std::cout << value << std::endl;}。
  • 接下来事例展示将一个函数传递给一个API,以便在未来的某个时间,可以为我们调用这个函数,现在不能掉用该函数,因为函数所需要的数据还为准备好,所以需要延迟调用。lambda可以很好的实现上述需求,代码实现如下:
  • []里面放的是lambda的捕获,当需要将外部的变量传入lambda{}中时用到。
  • #include <iostream>
    #include <vector>
    #include <functional>
    
    void ForEach(std::vector<int> vlaues ,const std::function<void(int)>& func)
    {
        for(int value:vlaues)
            func(value);
    }
    
    int main()
    {
        std::vector<int> values = {2,5,7,9,4};
        int a = 10;
        //想要在lambda中调用main函数的a变量,直接调用会报错
        //可以通过[=]值传递进行调用,也可以通过[&]传递进行调用
        //此时ForEach中的参数如果是原始函数指针就会报错,需要改成function
        auto lambda = [=](int value){std::cout << value << a << std::endl;};
        ForEach(values, lambda);
        
    }
    
  • std::find_if,迭代器查找值
  • #include <iostream>
    #include <vector>
    #include <functional>
    #include <algorithm>
    
    void ForEach(std::vector<int> vlaues ,const std::function<void(int)>& func)
    {
        for(int value:vlaues)
            func(value);
    }
    
    int main()
    {
        std::vector<int> values = {2,5,7,9,4};
        //用find_if查找vector中第一个比3大的元素
        auto it = std::find_if(values.begin(),values.end(),[](int value){return value>3;} );
        std::cout << *it << std::endl;
        int a = 10;
        //想要在lambda中调用main函数的a变量,直接调用会报错
        //可以通过[=]值传递进行调用,也可以通过[&]传递进行调用
        //此时ForEach中的参数如果是原始函数指针就会报错,需要改成function
        auto lambda = [=](int value){std::cout << value << a << std::endl;};
        ForEach(values, lambda);
        
    }
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/316335.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Oracle篇—实例中和name相关参数的区别和作用

☘️博主介绍☘️&#xff1a; ✨又是一天没白过&#xff0c;我是奈斯&#xff0c;DBA一名✨ ✌✌️擅长Oracle、MySQL、SQLserver、Linux&#xff0c;也在积极的扩展IT方向的其他知识面✌✌️ ❣️❣️❣️大佬们都喜欢静静的看文章&#xff0c;并且也会默默的点赞收藏加关注❣…

可以在微信群里使用midjourney,gpt4,gemini,文心一言4.0,且免费

免费使用gpt4和midjourney 免费使用 参考链接&#xff1a; https://chat.xutongbao.top/

(核心变量)全国上市公司对外开放程度+dofile+参考文献(2000-2022年)

上市公司的对外开放程度数据反映了这些公司在国际市场上的活跃度和全球化程度。这包括了它们的国际贸易参与度、跨国投资和合作、国际市场的营销和品牌推广策略&#xff0c;以及在不同国家和地区的业务布局。此外&#xff0c;这段时间内不同行业和公司的对外开放程度可能有明显…

IDEA新建SpringBoot工程时java版本只有17和21

解决方法&#xff1a;替换源 参考博客&#xff1a;https://www.kuazhi.com/post/712799571.html

VirtualBox安装linuxmint-21.2虚拟机并配置网络

VirtualBox安装linuxmint-21.2虚拟机并配置网络 适用于在VirtualBox平台上安装linuxmint-21.2虚拟机。 1. 安装准备 1.1 安装平台 Windows 11 1.2. 软件信息 软件名称软件版本安装路径Oracle VM VirtualBoxVirtualBox-7.0.12-159484D:\softwareCentOS7CentOS-7.9.2009E:\…

4点优势,昂首资本使用浮动差价不使用固定差价的原因

在交易中&#xff0c;很多投资者和昂首资本一样&#xff0c;会使用浮动点差而不使用固定点差&#xff0c;那是因为投资者和昂首资本一样认为&#xff0c;使用浮动差价交易会比使用固定价差交易更有优势。 首先在大部分交易时段&#xff0c;价差缩小。正如投资者和昂首资本所知…

亚马逊怎么防止店铺关联?

亚马逊&#xff08;Amazon&#xff09;为了确保公平竞争和防止不当行为&#xff0c;采取了一些措施来防止店铺关联&#xff0c;即通过不同的方式将多个店铺相关联&#xff0c;以获取不正当的竞争优势。以下是一些亚马逊防止店铺关联的主要措施&#xff1a; 同一经营者规定&…

自己动手写编译器:自顶向下的自动状态机

本节我们介绍编译原理中一种新的数据结构叫自顶向下的自动状态机。前面我们在做词法解析时接触了大量自动状态机&#xff0c;他们存在一个缺陷那就是无法对要识别的字符串进行计数&#xff0c;因此当我们要判断括号对是否匹配时&#xff0c;使用在词法解析的状态机就处理不了&a…

世界人口数据分析与探索

文章目录 世界人口数据集介绍数据集 1&#xff1a;世界国家统计数据&#xff1a;数据集 2&#xff1a;世界人口详细信息&#xff08;2023 年&#xff09;&#xff1a;数据集 3&#xff1a;按年份划分的世界人口&#xff08;1950-2023&#xff09;&#xff1a; 数据分析导入必要…

【金猿CIO展】步长制药信息化管理与建设中心总经理束炼:IT部门既要懂技术,也要懂业务...

‍ 束炼 本文由步长制药信息化管理与建设中心总经理束炼撰写并投递参与“数据猿年度金猿策划活动——2023大数据产业年度优秀CIO榜单及奖项”评选。 大数据产业创新服务媒体 ——聚焦数据 改变商业 随着数字化转型的浪潮席卷各行各业&#xff0c;中国数字经济已进入快速发展阶…

Godot之StringName解析

类描述 在Godot中&#xff0c;StringName是唯一字符串的内置类型。 StringName 是不可变的字符串&#xff0c;用于唯一名称的通用表示&#xff08;也叫“字符串内嵌”&#xff09;。值相同的两个 StringName 是同一个对象。进行比较时比普通 String 要快很多。 对于需要 Str…

【密码学】python密码学库pycryptodome

记录了一本几乎是10年前的书&#xff08;python绝技–用python成为顶级黑客&#xff09;中过时的内容 p20 UNIX口令破解机 里面提到了python标准库中自带的crypt库&#xff0c;经验证Python 3.12.1中并没有这个自带的库&#xff0c;密码学相关的库目前&#xff08;2024.1.12&a…

QT周四作业

题目&#xff1a; 代码&#xff1a; widget.cpp #include "widget.h" #include "ui_widget.h" #include <QDebug> Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);ui->lineEditName->setPlac…

JAVA数组以及小练习

目录 数组的概述和静态初始化 数组的地址值和元素访问 数组的遍历 数组的动态初始化 数组练习 数组的概述和静态初始化 package 数组;public class array1 {public static void main(String[] args){//格式//静态初始化//数据类型 [] 数组名 new 数组类型[]{元素1&#xf…

[开发语言][c++][python]:C++与Python中的赋值、浅拷贝与深拷贝

C与Python中的赋值、浅拷贝与深拷贝 1. Python中的赋值、浅拷贝、深拷贝2. C中的赋值、浅拷贝、深拷贝2.1 概念2.2 示例&#xff1a;从例子中理解1) 不可变对象的赋值、深拷贝、浅拷贝2) 可变对象的赋值、浅拷贝与深拷贝3) **可变对象深浅拷贝(外层、内层改变元素)** 写在前面&…

将WAP网站封装成App体验的全新策略

一、传统的App封装方式 传统的App封装技术通常依赖于WebView组件&#xff0c;将WAP内容嵌入到一个原生App框架中。这种方法虽然可以快速实现WAP到App的转换&#xff0c;但存在着明显的缺陷&#xff1a;首先&#xff0c;WebView的性能和用户体验都无法与原生组件相提并论&#x…

2024年1月12日:清爽无糖rio留下唇齿之间的香甜

友利奈绪的时间管理 2024年1月12日08:02:28进行java程序设计的上课准备 2024年1月12日08:02:44知道java的题目有18道 2024年1月12日08:43:07随机数去重比较 2024年1月12日08:54:03C语言题目最小公倍数 2024年1月12日08:58:37C语言题目二维数组变一维数组 2024年1月12日10…

四种无监督聚类算法说明

目录 一、K-Means无监督学习&#xff08;K-Means&#xff09;的认识-CSDN博客​​​​​​ 二、Mini-Batch K-Means -- Centroid models 三、AffinityPropagation (Hierarchical) -- Connectivity models 四、Mean Shift -- Centroid models 无监督聚类是一种机器学习技术&…

Star 8K+,使用.NET开发的开源NoSQL数据库

LiteDB 是一个轻量级、快速、易用的 .NET NoSQL 嵌入式数据库&#xff0c;完全用 C# 托管代码开发&#xff0c;并且是免费和开源的。它非常适合在移动应用&#xff08;Xamarin iOS/Android&#xff09;和小型的桌面/Web 应用中使用。 主要特点 简单易用的 API&#xff0c;类似…