C++基础进阶:函数、内联函数与Lambda函数详解

news2025/6/9 14:42:15
引言

在C++编程的旅程中,函数是构建复杂程序的基本单元。它们像乐高积木一样,允许我们将代码分解成更小、更易于管理的部分。今天,我们将深入探讨C++中的三种重要函数类型:普通函数、内联函数以及Lambda函数。掌握它们,将让你的C++编程技能更上一层楼!


一、函数:代码复用的基石

函数是C++中执行特定任务的代码块,它可以接收参数,并可能返回一个值。函数的定义包括返回类型、函数名、参数列表和函数体。使用函数,我们可以避免重复编写相同的代码,提高代码的可读性和可维护性。

示例代码

#include <iostream>

// 定义一个函数,用于计算两个整数的和
int add(int a, int b) {
    return a + b;
}

int main() {
    int result = add(5, 3);
    std::cout << "The sum is: " << result << std::endl;
    return 0;
}

在这个例子中,我们定义了一个名为add的函数,它接收两个整数参数,并返回它们的和。在main函数中,我们调用了add函数,并打印了结果。


二、内联函数:性能优化的利器

内联函数是C++提供的一种优化机制,它建议编译器将函数调用替换为函数体本身,从而减少函数调用的开销。内联函数通常用于小型、频繁调用的函数,以提高程序的执行效率。

特点

  • 减少函数调用的开销。
  • 适用于小型函数。
  • 由编译器决定是否真正内联。

示例代码

#include <iostream>

// 定义一个内联函数,用于计算两个整数的和
inline int addInline(int a, int b) {
    return a + b;
}

int main() {
    int result = addInline(5, 3);
    std::cout << "The inline sum is: " << result << std::endl;
    return 0;
}

在这个例子中,我们使用inline关键字定义了一个内联函数addInline。编译器可能会将这个函数的调用替换为函数体本身,从而提高执行效率。


三、Lambda函数:匿名函数的便捷之选

Lambda函数(也称为匿名函数)是C++11引入的一种新特性,它允许我们在需要函数的地方直接定义函数,而无需单独命名。Lambda函数在需要临时函数逻辑的场合非常有用,特别是在回调函数、条件检查或小型算法中。

语法

[capture clause] (parameters) -> return_type {
    // 函数体
}
  • 捕获列表:用于捕获外部变量。
  • 参数列表:与普通函数的参数列表类似。
  • 返回类型:可以省略,由编译器自动推断。
  • 函数体:包含需要执行的代码。

示例代码

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> numbers = {1, 2, 3, 4, 5};

    // 使用Lambda函数来打印向量中的每个元素
    std::for_each(numbers.begin(), numbers.end(), [](int num) {
        std::cout << num << " ";
    });
    std::cout << std::endl;

    // 使用Lambda函数来找到向量中的最大值
    auto maxElement = std::max_element(numbers.begin(), numbers.end(), [](int a, int b) {
        return a < b;
    });
    std::cout << "The maximum element is: " << *maxElement << std::endl;

    return 0;
}

在这个例子中,我们使用了两个Lambda函数。第一个Lambda函数用于打印向量中的每个元素,第二个Lambda函数用于比较两个整数,帮助std::max_element算法找到向量中的最大值。


上述例子中用到两个std中的函数:

for_each概述

for_each 常用于遍历容器并对每个元素应用特定的函数或函数对象。
头文件需要包含:

#include <algorithm>

函数原型:

Function for_each(InputIterator first, InputIterator last, Function f);
  • 模板参数:
    • InputIterator:输入迭代器类型,表示要遍历的范围。
    • Function:可调用对象类型,用于对每个元素执行操作。
  • 参数说明:
    • first,last:输入范围的起始和结束迭代器,遍历范围为 [first, last)。
    • f:函数或函数对象,对每个元素执行的操作。
  • 返回值:
    • 返回传入的函数对象 f,其可能被修改过(例如,包含了累积的状态)。-

max_element

std::max_element 是 C++ 标准库 中的一个算法,用于在给定范围内查找最大元素。这个函数的原型如下:

template< class ForwardIt, class Compare >
ForwardIt max_element(ForwardIt first, ForwardIt last, Compare comp);
  • 参数说明
    • comp:这是一个二元谓词(binary predicate),即一个可调用对象(函数、函数对象或 Lambda 表达式),它接受两个参数并返回一个布尔值。comp(a, b) 返回 true 表示 a 被认为小于 b。在这个比较中,std::max_element 会找到第一个使得 comp(a, b) 返回 false 的元素 a,即 a 被认为不小于 b。
  • 返回值:
    • ForwardIt:返回一个指向范围 [first, last) 中最大元素的迭代器。如果有多个最大元素,返回第一个最大元素的迭代器。
结语

通过本文的介绍,相信你对C++中的函数、内联函数和Lambda函数有了更深入的理解。函数是代码复用的基石,内联函数是性能优化的利器,而Lambda函数则提供了匿名函数的便捷之选。掌握它们,将让你的C++编程更加高效和灵活。继续加油,探索C++的更多奥秘吧!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

webpack其余配置

webpack搭建本地服务器 首先是要安装一个webpack-dev-server npm install webpack-dev-server -D 安装后在package.json中添加&#xff1a; {"name": "babel_core_demo","version": "1.0.0","main": "index.js"…

【CUDA 】第5章 共享内存和常量内存——5.3减少全局内存访问(2)

CUDA C编程笔记 第五章 共享内存和常量内存5.3 减少全局内存访问5.3.2 使用展开的并行规约思路reduceSmemUnroll4&#xff08;共享内存&#xff09;具体代码&#xff1a;运行结果意外发现书上全局加载事务和全局存储事务和ncu中这两个值相同 5.3.3 动态共享内存的并行规约reduc…

Python 训练营打卡 Day 46

通道注意力 一、什么是注意力 注意力机制是一种让模型学会「选择性关注重要信息」的特征提取器&#xff0c;就像人类视觉会自动忽略背景&#xff0c;聚焦于图片中的主体&#xff08;如猫、汽车&#xff09;。 transformer中的叫做自注意力机制&#xff0c;他是一种自己学习自…

Rust学习(1)

声明&#xff1a;学习来源于 《Rust 圣经》 变量的绑定和解构 变量绑定 let a "hello world":这个过程称之为变量绑定。绑定就是把这个对象绑定给一个变量&#xff0c;让这个变量成为它的主人。 变量可变性 Rust 变量默认情况下不可变&#xff0c;可以通过 mut …

鸿蒙仓颉语言开发实战教程:商城应用个人中心页面

又到了高考的日子&#xff0c;幽蓝君在这里祝各位考生朋友冷静答题&#xff0c;超常发挥。 今天要分享的内容是仓颉语言商城应用的个人中心页面&#xff0c;先看效果图&#xff1a; 下面介绍下这个页面的实现过程。 我们可以先分析下整个页面的布局结构。可以看出它是纵向的布…

智能生成完整 Java 后端架构,告别手动编写 ControllerServiceDao

在 Java 后端开发的漫长征途上&#xff0c;开发者们常常深陷繁琐的基础代码编写泥潭。尤其是 Controller、Service、Dao 这三层代码的手动编写&#xff0c;堪称开发效率的 “拦路虎”。从搭建项目骨架到填充业务逻辑&#xff0c;每一个环节都需要开发者投入大量精力&#xff0c…

Python----目标检测(yolov5-7.0安装及训练细胞)

一、下载项目代码 yolov5代码源 GitHub - ultralytics/yolov5: YOLOv5 &#x1f680; in PyTorch > ONNX > CoreML > TFLite yolov5-7.0代码源 Release v7.0 - YOLOv5 SOTA Realtime Instance Segmentation ultralytics/yolov5 GitHub 二、创建虚拟环境 创建一个3.8…

【Linux】文件赋权(指定文件所有者、所属组)、挂载光驱(图文教程)

文章目录 文件赋权创建文件 testChmod查看文件的当前权限使用 chmod 命令修改权限验证权限关键命令总结答案汇总 光驱挂载确认文件是否存在打包压缩压缩验证创建 work 目录将压缩文件复制到 work 目录新建挂载点 /MNT/CDROM 并挂载光驱答案汇总 更多相关内容可查看 此篇用以解决…

第22讲、Odoo18 QWeb 模板引擎详解

Odoo QWeb 模板引擎详解与实战 Odoo 的 QWeb 是其自研的模板引擎&#xff0c;广泛应用于 HTML、XML、PDF 等内容的生成&#xff0c;支撑了前端页面渲染、报表输出、门户页面、邮件模板等多种场景。本文将系统介绍 QWeb 的核心用法、工作原理&#xff0c;并通过实战案例演示如何…

【原理解析】为什么显示器Fliker dB值越大,闪烁程度越轻?

显示器Fliker 1 显示器闪烁现象说明2 Fliker量测方法2.1 FMA法2.2 JEITA法问题答疑&#xff1a;为什么显示器Fliker dB值越大&#xff0c;闪烁程度越轻&#xff1f; 3 参考文献 1 显示器闪烁现象说明 当一个光源闪烁超过每秒10次以上就可在人眼中产生视觉残留&#xff0c;此时…

Bootstrap Table开源的企业级数据表格集成

Bootstrap Table 是什么 ‌Bootstrap Table 是一个基于 Bootstrap 框架的开源插件&#xff0c;专为快速构建功能丰富、响应式的数据表格而设计。‌ 它支持排序、分页、搜索、导出等核心功能&#xff0c;并兼容多种 CSS 框架&#xff08;如 Semantic UI、Material Design 等&am…

vue3表格使用Switch 开关

本示例基于vue3 element-plus 注&#xff1a;表格数据返回状态值为0、1。开关使用 v-model"scope.row.state 0" 会报错 故需要对写法做些修改&#xff0c;效果图如下 <el-table-column prop"state" label"入学状态" width"180" …

【11408学习记录】考研写作双核引擎:感谢信+建议信复合结构高分模板(附16年真题精讲)

感谢信建议信 英语写作2016年考研英语&#xff08;二&#xff09;真题小作文题目分析写作思路第一段第二段锦囊妙句9&#xff1a;锦囊妙句12&#xff1a;锦囊妙句13&#xff1a;锦囊妙句18&#xff1a; 第三段 妙句成文 每日一句词汇第一步&#xff1a;找谓语第二步&#xff1a…

一套个人知识储备库构建方案

写文章的初心是做知识沉淀。 好记性不如烂笔头&#xff0c;将阶段性的经验总结成文章&#xff0c;下次遇到相同的问题时&#xff0c;查起来比再次去搜集资料快得多。 然而&#xff0c;当文章越来越多时&#xff0c;有一个问题逐渐开始变得“严峻”起来。 比如&#xff0c;我…

行李箱检测数据集VOC+YOLO格式2083张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;2083 标注数量(xml文件个数)&#xff1a;2083 标注数量(txt文件个数)&#xff1a;2083 …

实践提炼,EtherNet/IP转PROFINET网关实现乳企数字化工厂增效

乳企数字化工厂的核心技术应用 1. 智能质检&#xff1a;机器视觉协议网关的协同 液态奶包装线&#xff08;利乐罐装&#xff09;的漏码检测生产线&#xff0c;其高速产线&#xff08;20,000包/小时&#xff09;需实时识别微小缺陷&#xff0c;但视觉系统&#xff08;康耐视Ca…

从以物换物到DeFi:交易的演变与Arbitrum的DeFi生态

交易的本质&#xff1a;从以物换物到现代金融 交易是人类社会经济活动的核心&#xff0c;是通过交换资源&#xff08;如货物、服务或货币&#xff09;满足各方需求的行为。其本质是价值交换&#xff0c;旨在实现资源的优化配置。交易的历史可以追溯到人类文明的起源&#xff0…

分类场景数据集大全「包含数据标注+训练脚本」 (持续原地更新)

一、作者介绍&#xff1a;六年算法开发经验、AI 算法经理、阿里云专家博主。擅长&#xff1a;检测、分割、理解、大模型 等算法训练与推理部署任务。 二、数据集介绍&#xff1a; 质量高&#xff1a;高质量图片、高质量标注数据&#xff0c;吐血标注、整理&#xff0c;可以作为…

Web后端开发(SpringBootWeb、HTTP、Tomcat快速入门)

目录 SpringBootWeb入门 Spring 需求&#xff1a; 步骤&#xff1a; HTTP协议&#xff1a; 概述&#xff1a; 请求协议&#xff1a; 响应协议&#xff1a; 协议解析&#xff1a; Web服务器-Tomcat&#xff1a; 简介&#xff1a; 基本使用&#xff1a; SpringBootWeb…

android binder(四)binder驱动详解2

二、情景分析 1、ServiceManager 启动过程 2. 服务注册 服务注册过程(addService)核心功能&#xff1a;在服务所在进程创建binder_node&#xff0c;在servicemanager进程创建binder_ref。其中binder_ref的desc在同一个进程内是唯一的&#xff1a; 每个进程binder_proc所记录的…