C++中的引用

引用的理解

引用不是新定义了一个变量,而是对变量取别名,不会开辟额外的内存,引用和它所引用的变量公用同一块内存空间。

举例:

image-20221020155038347

注意:引用类型和引用实体的类型必须是一样的。

引用的特性

  • 引用在定义时必须初始化(引用可以看作是在对变量起别名,所以必须得先有变量),

  • 一个变量可以有多个引用(一个变量当然可以起很多别名,也就是很多引用),

  • 引用一旦引用一个实体,就不能在引用其它实体(一个名字只能标识一块内存,且名字不能更换)。

常引用

与引用关联的非常重要的一个属性就是权限,由于引用是在给以分配的一块内存起别名,所以可以这块内存可以被多个名字修改,但是如果这块内存本来被赋予了const属性,那么起的别名也就是引用也必须有const属性,因为权限只能平移和缩小,绝不能放大。

截屏2022-10-20 18.50.23

image-20221020185145313

不同类型变量间的引用(重点)

截屏2022-10-20 18.54.36

从发生错误的原因可以发现:如果需要用int&引用char的话,需要给int&加上const,这是为什么呢?

原因在于:n和c的类型不同,所以在进行引用操作的时候,n并不是直接引用的c,而是c会把类型转化后的值交给一个临时变量,n再去引用这个临时变量,但是又因为该临时变量具有常性,所以n也必须具有常性。

引用最常使用的场景(非常重要)

做参数

例一

比如我们写一个swap函数,由于我们需要操作两数的内存,所以我们必须得传指针,但是在有了引用之后,直接传值就可以,用别名就可以直接操作内存。

image-20221020191212200

并且,我们在传指针的时候会开辟内存,但是引用不会。

例二

函数传值并不是直接将实参传给形参的,而是中间有个临时变量(跟实参一样大),这也就导致如果是值传的话,会多拷贝一份临时空间,如果该值很大且次数很多的话,运行效率就会下降。

但是函数传引用的话,虽然也会有临时变量产生,但该临时变量存放的是地址,无论值有多大,临时变量永远是4/8个字节。

这也是引用传参的优势。

image-20221020194946705

image-20221020194951150

做返回值

当我们返回一个变量的时候,同样也会产生临时变量并且该临时变量和返回变量一样大,所以这里就可以用引用返回,但是用引用返回需要注意一点:返回的变量在函数销毁后必须还是存在的!

因为函数返回后,函数栈帧就会被“”销毁“”,在栈帧中的局部变量也会被“销毁”,所以此时仍用引用返回的话,此时引用的内存已经返回给操作系统了,返回的值就是不确定的。

引用和指针的区别

引用在语法概念上是取别名,没有独立的空间,引用和实体共用一块空间,但是在底层实现上引用也是有空间的,因为引用和指针的实现方式是一样的!

image-20221020202038204

截屏2022-10-20 20.19.21

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云朵c

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值