c++在指针的基础上添加了引用,祖师爷本贾尼博士既然要创建这个语法,说明指针一定有不足之处。那么接下来就来学习一下引用:
引用的概念
引用就是给一个变量取取别名。例如西游记里的孙悟空又叫齐天大圣,也叫孙行者。
所以我们取了别名就可以直接来使用原名对应下的内存数据了。
引用的语法
引用用 "变量名&"来创建
引用可以给变量取别名,也可以给别名取别名。
引用的特性和优点
A:引用在创建时必须被初始化。相当于生活中我们不能凭空取名,取名要对照某个物体。
B:一个变量可以用多个引用。就像一个人可以有多个名字,自己的全名、书名、小名等。
C:引用一旦引用一个变量,就不能再引用其他变量。就像一个人的名字只能你用,不能给其他人。
D:因为引用和原名是共用一个内存的,所以创建引用是不会额外开辟空间的。
E:引用不像指针需要解引用操作,而是拿到了直接就可以操作,增加了代码的可读性,同时写的爽。
F:在一些操作符重载的情形下,必须要返回引用,即返回它自己,这样就可以继续操作自己,而返回指针是不好操作的
这里以类进行举例,我们重载一个+=的运算符。就可以完成(x+=y)+=y的操作。
因为x+=y返回值是x的别名,那么就相当于x+=2y。
G:引用创建前需要有对象,所以能够避免空指针的出现。
const引用
直接的引用是可以修改原地址的,但是有些情况我们并不希望值能够被修改,因此就有了const&
这种引用能够让当前的别名只读不可写。
引用不能引用空值
但是可以这样写
但是这里并不能代表它指向了空值,因为它指向的是一个已经有的对象,这个对象的地址并不是空值,只能说它存放的地址是空值。
const引用能够让我们给一些常量取别名
众所周知,"ada"这个是存储在代码段里面的,属于是常量的一种。我们用值接收的时候,它就会产生一个临时变量供我们接收,这个临时变量具有常性,所以我们必须要用常引用来接收,否则就会发生“权限放大”。
其实这种产生中间变量很常见
下面这些情况都是一样的,顺序是先开辟空间,然后被临时变量赋值,这个临时变量就是通过右侧的值返回的。
const 引用的作用
它还是很重要的,因为引用很方便,经常作为传参:
例如这个函数,我们就可以操作传过来的值。但是如果我们传入的是数组等常量呢?就会发生权限的放大,原来不可修改的值被放大成能在函数里面修改了。所以我们需要加const来增加传参的范围。
引用的底层
我们通过汇编来看,发现引用和指针的底层都是一样的,所以引用的底层就是指针。