C++入门——内联函数、auto关键字、基于范围的for循环
C++入门——内联函数、auto关键字、基于范围的for循环
一、内联函数
1.概念引入
在C语言中,我们为了让函数调用不需要建立栈帧,提高效率,引入了宏函数,但是,宏函数存在较多的问题:首先,宏函数比较复杂,容易出错,可读性差;再者,宏函数还不能调试,因为在预处理的阶段就替换掉了,我们举个例子:
宏函数是易错的,这里的括号不能少,因为在预处理阶段,Add(10,20)是被直接替换成文本的,稍有不慎就会因为运算优先级问题导致结果不是我们想要的;而且这里的语法也容易出错,x、y前面不需要加类型,最后也不需要加return,都需要我们注意到。由此可见,宏函数需要一个更好的代替者——内联函数。内联函数以inline修饰,编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数可以提升程序运行的效率。
2.使用特性
(1)我们来看一下内联函数的简单使用:
- 内联函数的具体写法还是和普通的函数一样,只不过要加上一个inline即可,非常方便,编译时C++编译器会在调用内联函数的地方展开(宏函数是在预处理阶段进行替换),代码会被直接插入每个调用点。
- inline是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段,会用函数体替换函数调用,
- 缺陷:可能会使目标文件变大,
- 优势:少了调用开销,提高程序运行效率。
(2)注意事项
- inline对于编译器而言只是一个建议,不同编译器关于inline实现机制可能不同,一般建议:将函数规模较小(即函数不是很长,具体没有准确的说法,取决于编译器内部实现)、不是递归、且频繁调用的函数采用inline修饰,否则编译器会忽略inline特性。
- 内联函数不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址了,链接就会找不到。
二、auto关键字
1.概念引入
随着程序越来越复杂,程序中用到的类型也越来越复杂,经常体现在类型难于拼写以及 含义不明确导致容易出错,因此我们可以使用auto自动判断数据类型。
我们现在写的代码,并没有涉及到很复杂的类型,当我们学到标准模板库时,就会体会到auto的重要性了,我们先体验一下:
使用auto定义变量时必须对其进行初始化,在编译阶段编译器需要根据初始化表达式来推导auto的实际类型。因此auto并非是一种“类型”的声明,而是一个类型声明时的“占位符”,编译器在编译期会将auto替换为变量实际的类型。
2.注意事项
- auto与指针和引用结合起来使用:
用auto声明指针类型时,用auto和auto*没有任何区别,但用auto声明引用类型时则必须加&。 - 在同一行定义多个变量:
当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量,如图所示:
- auto不能作为函数的参数
- auto不能直接用来声明数组
三、基于范围的for循环
对于一个有范围的集合而言,由程序员来说明循环的范围是多余的,有时候还会容易犯错误。因此C++11中引入了基于范围的for循环。for循环后的括号由冒号“ :”分为两部分:第一部分是范
围内用于迭代的变量,第二部分则表示被迭代的范围。
- 依次取数组中数据赋值给e
- 自动迭代,自动判断结束
- 这里使用auto可以自动判断arr中是什么数据类型,当然,不用auto也可以,这里我们知道数组arr中的数据是整型,因此,可以使用int,如图所示:
当然,不管我们是否知道数据类型,我们都推荐使用auto,这样会更加方便。
我们还可以范围for对数组里的内容进行修改:
在这里,e就是数组arr中元素的别名,通过这种方式,我们可以对数组里的内容进行修改。
本期总结+下期预告
本期内容篇幅较短,简单易懂。从下期内容开始,我们将进入C++初阶部分,包括类和对象,标准模板库(初阶)等内容!
感谢大家的关注,我们下期再见!