已经无数次踩这个坑了,因为平时项目中用的都是java,js,python,很少使用C++,所以C++中的一些基础知识总是忘。这次是连续两天都踩了引用的坑,最终下定决心写一篇笔记,一定要记住,绝不再踩。
关于引用,一个变量的引用即是一个变量的别名,对该引用的操作等同于直接操作该变量。其定义方法如下,需要注意定义引用时一定要初始化,否则编译出错。

int a;
int & b = a;

这种直接在外面额外定义一个引用来操作变量的情况比较少。
而引用比较容易踩坑的地方是在函数调用时。在函数定义时我们需要定义函数的参数,其中可以将形参定义为引用类型的,这时候在传参时传递的就是引用,而不定义为引用类型的则是传值。

int func(int a);
int func(int& a);

上面第一种写法就是传值,第二种写法就是传引用。其区别相当之大。就如同我们开始所说的,对引用的操作等同于直接操作该变量,而对值的操作则对实参毫无影响。在传值时,计算机会复制一份实参的副本到另一地址中,在函数中对该形参的改变均在副本上进行,而不回反应到实参上,所以在函数中对参数的改变是不会反馈到函数外的变量上的。而传引用则是将实参的地址传入函数,对该参数的改变都会直接在实参上进行,故改变会在函数结束后一直保留。
所以想要在函数中修改入参时,一定要记得将形参设为引用类型。
这里可能还有疑惑是传引用和传指针的区别,其区别是指针可以改变其指向的对象,当逻辑复杂时可能出错,而引用在初始化指定了引用的对象后就不能再更改引用对象。还有一点时指针类型会被分配额外的内存来存放其指向的地址,而引用则不需要。