当前位置: 首页 > article >正文

C++入门——内联函数、auto关键字、基于范围的for循环

C++入门——内联函数、auto关键字、基于范围的for循环

一、内联函数

1.概念引入

在C语言中,我们为了让函数调用不需要建立栈帧,提高效率,引入了宏函数,但是,宏函数存在较多的问题:首先,宏函数比较复杂,容易出错,可读性差;再者,宏函数还不能调试,因为在预处理的阶段就替换掉了,我们举个例子:
示例1
宏函数是易错的,这里的括号不能少,因为在预处理阶段,Add(10,20)是被直接替换成文本的,稍有不慎就会因为运算优先级问题导致结果不是我们想要的;而且这里的语法也容易出错,x、y前面不需要加类型,最后也不需要加return,都需要我们注意到。由此可见,宏函数需要一个更好的代替者——内联函数。内联函数以inline修饰,编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数可以提升程序运行的效率。

2.使用特性

(1)我们来看一下内联函数的简单使用:

示例2

  • 内联函数的具体写法还是和普通的函数一样,只不过要加上一个inline即可,非常方便,编译时C++编译器会在调用内联函数的地方展开(宏函数是在预处理阶段进行替换),代码会被直接插入每个调用点。
  • inline是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段,会用函数体替换函数调用,
  • 缺陷:可能会使目标文件变大,
  • 优势:少了调用开销,提高程序运行效率。
(2)注意事项
  • inline对于编译器而言只是一个建议,不同编译器关于inline实现机制可能不同,一般建议:将函数规模较小(即函数不是很长,具体没有准确的说法,取决于编译器内部实现)、不是递归、且频繁调用的函数采用inline修饰,否则编译器会忽略inline特性。
  • 内联函数不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址了,链接就会找不到。

二、auto关键字

1.概念引入

随着程序越来越复杂,程序中用到的类型也越来越复杂,经常体现在类型难于拼写以及 含义不明确导致容易出错,因此我们可以使用auto自动判断数据类型。
我们现在写的代码,并没有涉及到很复杂的类型,当我们学到标准模板库时,就会体会到auto的重要性了,我们先体验一下:
示例4
使用auto定义变量时必须对其进行初始化,在编译阶段编译器需要根据初始化表达式来推导auto的实际类型。因此auto并非是一种“类型”的声明,而是一个类型声明时的“占位符”,编译器在编译期会将auto替换为变量实际的类型。

2.注意事项

  • auto与指针和引用结合起来使用:
    用auto声明指针类型时,用auto和auto*没有任何区别,但用auto声明引用类型时则必须加&。
  • 在同一行定义多个变量:
    当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量,如图所示:
    示例5
    示例6
  • auto不能作为函数的参数
  • auto不能直接用来声明数组

三、基于范围的for循环

对于一个有范围的集合而言,由程序员来说明循环的范围是多余的,有时候还会容易犯错误。因此C++11中引入了基于范围的for循环。for循环后的括号由冒号“ :”分为两部分:第一部分是范
围内用于迭代的变量,第二部分则表示被迭代的范围。
示例7

  • 依次取数组中数据赋值给e
  • 自动迭代,自动判断结束
  • 这里使用auto可以自动判断arr中是什么数据类型,当然,不用auto也可以,这里我们知道数组arr中的数据是整型,因此,可以使用int,如图所示:
    示例8
    当然,不管我们是否知道数据类型,我们都推荐使用auto,这样会更加方便。
    我们还可以范围for对数组里的内容进行修改:
    示例9
    在这里,e就是数组arr中元素的别名,通过这种方式,我们可以对数组里的内容进行修改。

本期总结+下期预告

本期内容篇幅较短,简单易懂。从下期内容开始,我们将进入C++初阶部分,包括类和对象,标准模板库(初阶)等内容!

感谢大家的关注,我们下期再见!
在这里插入图片描述


http://www.kler.cn/a/582380.html

相关文章:

  • FastDDS中Utils定义的那些数据结构(二)
  • 【TMS570LC4357】之工程创建
  • UE5.5 Niagara 发射器粒子更新模块
  • 基于SpringBoot的租房管理系统实现与设计
  • 用C# Newtonsoft.Json库实现JSON数据中某个字段值的提取
  • LLM最新的模型微调技术有哪些
  • 爬虫一些基础知识的备忘录(需要自取)
  • 【Academy】SSRF ------ Server-side request forgery
  • 2025年是Matter智能家居至关重要的一年?
  • NetAssist 5.0.14网络助手基础使用及自动应答使用方案
  • 鸿蒙 Java 人工智能 嵌入式 测试运维简单分析
  • Android Retrofit 框架适配器模块深入源码分析(五)
  • windows版本的时序数据库TDengine安装以及可视化工具
  • 元宇宙:虚实融合中的消费新空间探析
  • 2025解决软件供应链安全,开源安全的版本答案:SCA+SBOM
  • Docker:容器化技术实战指南
  • 谈谈Error和Exception的区别
  • 【性能测试入门_01性能测试jmeter基础实操场景详解】
  • Linux中的基本指令(上)
  • Flutter 基础组件 Image 详解