C++的引用

  今天给大家介绍的是C++中的另外一个新东西---引用。

  首先大致的介绍一下引用,引用是C语言中没有的一个概念,但是他的模样却不陌生。之前在介绍const用法的时候简单的说过引用,&,这是引用的符号,他和C语言中的取地址符是一模一样的,这样导致很多人刚接触的时候不知道到底是代表着什么。引用实际上就是给你的变量起的一个别名。这也很好理解,比如我们学校叫做西安工业大学,当地人都叫西工院,西工院就是对我们学校的一个别名,这两个名字说的是同一个学校,只是叫法不一样了而已。我刚接触的时候,认为这是一个很鸡肋的行为,只是简单的一个别名,为什么在C++中会有很广泛的用法,会起到很大的作用呢?今天就给大家一一介绍一下。

 C++的引用

C++的引用

首先大家看一下这个程序的内容和运行结果,因为在vim不能通过简单的复制粘贴将代码拷贝出来,这里我就通过截图让大家看一下,这里b就是a变量的别名,也就是说输出b的时候,实际上就是在输出a。

如果大家感觉这样并没有说服力,可能是b在获取随机值的时候正好是10,那还有一个更加粗暴简单的方法来看。

 C++的引用

这个程序我们输出的是x,y。这里的x和y是指针分别指向了x和y两个元素,简单的来说xy中存储的就是a和b的地址。

 C++的引用

  运行结果就可以看出,a和b的地址是同一片空间,也就是说,a和b实际上就是同一个元素。这就是起别名的本质,他并没有创造一个新的变量。

 C++的引用

 C++的引用

我们大家都知道在C语言中常常会有的一个考点就是形参和实参是两个东西,形参只在调用后函数的时候才有调用结束之后会自动销毁,但是,但你的形参采用引用的时候,就不一样了,这里是直接将实参用来函数中的程序执行。所以这里并没有用到指针,没有返回值仍然是将两个数的值进行了调换。这里并没有产生实参的副本,而是直接对你的实参进行了操作,这里是两个int类型的数,如果是一个自定义结构体的变量的话,可能会占用很大的内存空间,当你想直接对实参进行操作,又不想传十分复杂的指针的时候,就可以通过引用来实现。

  Const与引用结合的时候,也会产生很多的误解,导致经常使用不清楚,但是这个问题我在之前的const用法已经详细介绍过了,这里我就不过多的介绍了,如果有遇到问题的可以去看我之前的博客。

https://blog.****.net/hanani_jia/article/details/80552219

上边介绍了引用作为参数传递的时候的用法,还有一个跟参数传递类似的就是返回值。

 C++的引用

这里有temp是一个全局变量,因为如果在func函数内定义的话,当func函数运行结束的时候,temp就会销毁,那函数再返回他的别名已经没有任何意义了,因为这片空间程序已经释放掉了,没有访问权限了。所以这里在运行引用的时候还要注意一个原则, 那就是你现在返回的这个别名他本身在函数结束之后不会销毁,他还是存在的,只有这样的变量你才可以放回他的引用。

 C++的引用

可以看出来b的值已经变成了100;

  引用在程序本身带的这些变量上体现的并不是很明显,当你创建一个自定义变量的时候,例如结构体例如类,那时候他的空间可能会很大,这样引用就有了很大的提升。

 大家如果接触过汇编的话可以通过vim或者vs将你的引用指令变成汇编代码,就会发现,

 C++的引用

实质上这里b就是a的一个指针,了解汇编的都明白lea的作用。所以在底层的实现上引用和指针实质上是一样的两种方式。

C++的引用 

 

再通过汇编看当传值和应用返回的时候区别是很大的。

还是那句,在当前这些常用变量类型下是看不出来的,再自定义变量的时候就会有很大的区别,不只是开辟空间的问题,当你返回的对象是一个类的对象时,这里如果通过值返回的话,会再开辟一个空间,因为当前空间当你函数调用结束的时候就会释放掉,这里会再开辟一片空间,然后将你的ret的值放进去,这里就会再次用到类中的拷贝构造函数,所以这里不只是简简单单的空间问题还会有效率问题。所以在C++中引用是一个很好的选择。

  既然上边看了汇编代码后发现,本质上汇编和指针在底层实现是一样的,那这两个到底有什么区别呢?我们在选择的时候应该什么时候选择指针什么时候选择引用,这里就在介绍一个这两个的利与弊。

1. 指针是可以更改的,我在程序开始可以指向这片空间,在之后可以指向另外一片,随时随地都可以让他指向任何地方,但是引用是不可以的,在你定义的时候就已经确定好了。直到整个程序结束他都是不可以进行更改的。

2. 指针可以是空可以指向无效的变量,但是引用就不可以,引用必须指向的是有效的变量。通过这两点就可以看到引用的区别,很多人在使用指针的时候会遇到很多的问题,以至于一头雾水,这里用引用就很好的解决了之前所遇到的很多问题。

3. 当使用sizeof的时候,sizeof引用得到的就是这个变量的大小,但是当你sizeof指针的时候得到的是指针的大小。

4. 之前大家学过指针的++都知道指针再加的时候加的是当前指向变量类型的大小,但是引用的++就有很多可能性,当你再加上C++中的运算符重载++的结果就会按照你的意愿来执行。

5. 相对来说引用会比指针安全一些。指针是一个双刃剑,如果能正确操纵他的话,他是一把很厉害的剑能帮你实现很多功能,但是如果不能十分深刻的理解指针还去随意使用的话,那伤害的也就是你自己了。