C++中引用、内联函数、auto关键字和范围for循环详解

 更新时间:2023年02月10日 10:51:15   作者:蓝色学者i  
本文主要梳理了C++当中一些琐碎的知识点,包括有命名空间,缺省参数,引用,auto关键字和内联函数,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

一、前言

大家好久不见,这篇文章带大家学习一下C++中的引用和内联函数

二、引用

引用变量是一个别名,也就是说,它是某个已存在变量的另一个名字,举个例子,李逵有很多外号,这些外号都是指李逵这一个人,因此这些外号都是他的引用!

一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量。

在C++中,我们用int(数据类型)& +引用名称(b) = 变量名称(a) 来表示b是a的 一个 别名,别名当然可以有很多个!

如图,b是a的别名,因此a和b的值、地址全部都一致。

引用与指针不同,引用必须指向已经存在的变量,必须赋值,即不能出现如下写法:

int& b; //空引用‘b' ❌
int* b; //空指针'b‘ ✔️

引用一旦指向一个变量,就不能再指向其他变量,因为引用相当于变量的别名,若更换引用,实际上是给变量赋值。

想要把b改为c的别名,但事实上,b仍然是a的别名,指向同一块空间,只是这块空间的值被改为了c的值

总结一下,C++中引用一共有三个特性:

  • 引用在定义时必须初始化
  • 一个变量可以有多个引用
  • 引用一旦引用一个实体,再不能引用其他实体

引用作为一种数据类型,是既可以作为参数传递,也可以作为返回值返回,我们重点讨论一下传值返回和传引用返回。

✔️作用范围:传引用返回只能在空间不会随函数结束而销毁的情况,传值返回可以函数结束销毁的适合返回。

✔️使用效率:正是由于传值返回返回变量的临时拷贝,所以传引用返回会带来性能上的提升,但有些时候是 不可以传引用返回的,如果你将一块栈上的空间返回了别名,会引发严重的错误

引用与指针功能类似,又有很多不同:

  1. 引用概念上定义一个变量的别名,指针存储一个变量地址。
  2. 引用在定义时必须初始化,指针没有要求
  3. 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体
  4. 没有NULL引用,但有NULL指针
  5. 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32位平台下占4个字节)
  6. 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小
  7. 有多级指针,但是没有多级引用
  8. 访问实体方式不同,指针需要显式解引用,引用编译器自己处理
  9. 引用比指针使用起来相对更安全

三、内联函数

以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率。

//内联函数的格式
inline int Add(int x,int y)
{
	return x+y;
}

内联函数与C语言宏相似,因此也是一种空间换时间的做法,虽然能够提高运行效率,但会让目标文件变大。

与C语言宏不同,内联函数支持调试,并且可以规避C语言宏的一系列问题。

#define Add(a,b) ((a)+(b))

如果上述宏少写括号都会引发严重的问题,与乘法结合之类的问题就会频出,内联函数很好的解决了这个问题。

内联函数定义和声明在一起!因为inline就没有函数地址了,链接无法找到这个函数!声明和定义都在类中的函数也被认为是内联函数,因此简短的函数适合将声明和定义都放在类内声明和定义。

四、auto关键字

auto是C++11新增的一个关键字,能够自动推导变量类型,与C语言中typedef的功能类似。

但需要注意,使用auto定义变量时必须初始化,否则无法通过编译在编译阶段编译器需要根据初始化表达式来推导auto的实际类型。因此auto并非是一种“类型”的声明,而是一个类型声明时的“占位符”,编译器在编译期会将auto替换为变量实际的类型。

auto细节说明:

1、可以自动推导出auto为指针类型,但不能推导引用,因此引用类型只能加&

auto  a = &A;
auto* b = &A;
auto& c =  A;

2、在同一行使用auto时必须保证都是同一类型,编译器只推导第一个类型,然后将类型给与其他变量

auto a = 10,b=20,c=30;√
auto a = 10,b='a';    X

3、auto不能声明数组,也不可以作为函数的参数

int func(auto x){};   X
auto arr[200];        X

五、范围for循环

对于有范围的数组,范围for循环能够让程序员更方便的遍历数组

int arr[10] = {0,1,2,3,4,5,6,7,8,9};
for(int i = 0;i<sizeof(arr)/sizeof(arr[0]);i++)//传统for循环
for(int e : arr) //范围for循环

for循环后的括号由冒号“ :”分为两部分:第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围。

需要注意的是,e是临时变量,更改时无法改变原数组,若要改变原数组,可以使用引用:

for(int& e : arr) //引用

六、结语

到此这篇关于C++中引用、内联函数、auto关键字和范围for循环的文章就介绍到这了,更多相关C++引用、内联函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++设计模式之原型模式

    C++设计模式之原型模式

    这篇文章主要介绍了C++设计模式之原型模式,本文讲解了什么是原型模式、为什么要使用原型模式、代码实例等内容,需要的朋友可以参考下
    2014-09-09
  • C++将保存char、int 和double到txt文件中

    C++将保存char、int 和double到txt文件中

    这篇文章主要介绍了C++如何将保存char、int 和double到txt文件中,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • C++遍历文件夹下文件的方法

    C++遍历文件夹下文件的方法

    这篇文章主要介绍了C++遍历文件夹下文件的方法,实例分析了C++针对文件夹遍历的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • C语言中的强符号和弱符号介绍

    C语言中的强符号和弱符号介绍

    这篇文章主要介绍了C语言中的强符号和弱符号介绍,本文用多个实例来讲解强符号和弱符号,需要的朋友可以参考下
    2015-03-03
  • 浅析C/C++中sort函数的用法

    浅析C/C++中sort函数的用法

    做项目的时候,排序是一种经常要用到的操作。如果每次都自己写个冒泡之类的O(n^2)排序,不但程序容易超时,而且浪费宝贵的时间,还很有可能写错。STL里面有个sort函数,可以直接对数组排序,复杂度为n*log2(n)。
    2014-09-09
  • C语言中判断两数组中是否有相同的元素

    C语言中判断两数组中是否有相同的元素

    下面是我在做IF语句练习时遇到的一个练习题,想要整理在博客上判断两个数组中是否有相同的元素,需要的朋友可以参考下
    2019-10-10
  • Define,const,static用法总结

    Define,const,static用法总结

    const定义的全局数据变量,其基本作用和define相同,但又在define的基础上增加了好多功能
    2013-10-10
  • 利用c++和easyx图形库做一个低配版扫雷游戏

    利用c++和easyx图形库做一个低配版扫雷游戏

    这篇文章主要介绍了用c++和easyx图形库做一个低配版扫雷游戏,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-01-01
  • C语言#define拼接宏定义实现方式

    C语言#define拼接宏定义实现方式

    今天小编就为大家分享一篇C语言#define拼接宏定义实现方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • Qt 进度条的实现示例

    Qt 进度条的实现示例

    进度条在很多时候都可以用到,有时我们需要在表格,树状栏中直观显示任务进度或消耗百分比,本文就详细的介绍一下Qt 进度条的使用实例,感兴趣的可以了解一下
    2021-06-06

最新评论