首先,我们先来大致地理解一下引用:
我们都知道变量,在之前的变量使用中,一个变量的值往往只对应一个变量名,在学习引用以后,我们就可以用多个变量名来调用同一个变量值。
先定义一个变量int a = 10,那么现在我想让10这个值除了用a可以调用以外,我还想用另一个变量名b也可以调用这个变量a对应的10,也就是a,b两个变量名可以共用这一个变量值,就是给变量a起一个别名叫b
通俗讲:
相当于现在有一个人,真名叫**明,小名叫小明,又取了个昵称叫明明,那么我们说**明、小明、明明都是指这个人。这个人就是变量的值,而这些名字就是变量名。
语法如下:
数据类型 &别名 = 变量名;
举个例子:
int a = 10;
int& b = a;
在这个例子里,变量10就有了两个变量名a和b,在输出时我们输出a会得到这个值,输出b也会的到同样的值,对a值进行修改,b的值也会同样变化
那么我们用一段代码来验证一下:
int main()
{
int a = 10;
int& b = a;
cout << "a的值是" << a << endl;
cout << "b的值是" << b << endl;
b = 100;
cout << "a的值是" << a << endl;
system("pause");
return 0;
}
引用的注意事项:
1、引用必须要初始化
引用初始化的意思是说我们在定义一个引用时,必须带上引用的对象。
相对的在定义变量时我们可以直接定义一个变量而不赋值,比如int a;就可以结束了,但是引用不能直接写一个int &a;而不带上引用的对象。
简化一下就是:
int &b; (×)
int &b = a;(√)
2、引用初始化之后不能再改变
这里的不能改变是指引用对象不可更改,比如我用b引用了a,那么b就只能引用a,不能再去引用c
这个非常简单也很好理解,就不多赘述了。
引用的本质:
通过上边的学习,,我们已经对引用有了一个大致的了解,那么我们再来认识一下引用的本质是什么。
引用的本质就是一个指针常量
那么我们再来回顾一下指针常量:
对于指针常量而言,指针的朝向是不可修改的,而指针的值是可以修改的,这也就解释了为什么引用在初始化以后就不能再修改引用的对象而只能修改值了。
那么我们再来用引用做一个案例:
上面我们已经学习到了引用的本质就是一个指针常量,本质上也是一个指针,那么我们就可以用引用实现一下交换两个变量值的函数。
代码如下:
那么这是用引用做形参,函数可以正常的运行。
要注意一下,在返回一个引用的返回值的时候,我们要避免返回一个局部变量的引用值。在之前我们有学习过,局部变量时存放在栈区的,在函数运行完后就会被释放掉,那么如果我们要多次调用这个返回值的时候,就会导致之后的返回值变为随机值,就会产生错误。
如果我们将引用作为函数的返回值,那么我们可以将函数调用作为左值进行修改。
我们再介绍一下常量引用,语法非常的简单,再正常的引用前加上一个const就可以了。
那么常量引用的不同之处在于我们可以不为常量引用赋初值,上边我们提到了,引用的本质也是指针,所以必须初始化。那么常量引用会由系统自动开辟出一块内存,来存放常量引用的值。而且常量引用时不可修改的,变为只读的,这就避免了我们有些时候会错误的修改掉一些变量。