引用
C++定义了一套包括算术类型和空类型在内的基本数据类型。
算术类型: 字符、整型数、布尔值、浮点数
空类型: 无对应的值
复合类型是指基于其他类型定义的类型。
这里主要介绍 引用、指针
在c++11中新增了一种引用——右值引用,而平时说的引用,主要是指:左值引用,这里我们先介绍左值引用(下文以 引用 替代):
一句话理解引用:引用是为已经存在的某个对象,起个别名。
举个例子:你女朋友叫张某某,你觉得叫三个字太累,给她起了个昵称,宝宝。
当你聊天打字,输入宝宝时,就指代张某某。这里,张某某 = 宝宝,指代同一个人。
引用定义
引用的书本定义:引用为对象起了另一个名字,引用类型 引用另外一种类型。通过将声明符写成 &d 的形式来定义引用类型,其中d是声明的变量名。
看代码理解:
int ival = 1024; //定义算术类型int,变量名为ival (上面例子中的张某某)
int &refVal = ival; //引用,refVal指向ival (refVal=宝宝,是张某某的别名)
int &refVal2; //引用错误,引用未初始化 (女朋友都没有,叫谁宝宝???)
从上面的代码片段可以看出来两点:
1.定义引用时,代码把引用和它的初始值绑定到一起。
2.初始化完成后,引用将和它的初始值对象一直绑定在一起,这时引用无法再绑定到另一个对象上。因此,引用必须要初始化。
再以上面的例子,解析一下这两句话:
1.当输入宝宝的时候,就特指张某某,他们始终是一个人,不可分开。
2.当使用宝宝这个昵称后,不能再让宝宝指代李某某,王某某等。也就是说,宝宝在使用之前,一定要先有个女朋友张某某。
引用特性
- 定义一个引用之后,对其进行的所有操作都是在与之绑定的对象上进行
- 举例:对宝宝的所有亲亲抱抱举高高都是发生在张某某身上
- 引用赋值,实际上把值赋给了与引用绑定的对象
- 举例:给宝宝发红包,实际上是把钱给了张某某
- 获取引用的值,实际上是获取了与引用绑定的对象的值
- 举例:从宝宝那里要零花钱,实际上是找张某某拿的钱
代码解析
现在从代码的角度,来看看上面所说的特性:
int ival = 1024; //定义算术类型int,变量名为ival
int &refVal = ival; //refVal为ival的别名
refVal = 2; //把2赋值给refVal所指向的对象,即ival (给宝宝发红包,实际给了张某某)
int num = refVal; //实际上:num = ival (宝宝给你零花钱,实际上就是张某某给你钱)
int &refVal3 = refVal; //refVal3绑定到了与refVal绑定的对象上,即ival (宝宝叫腻了,换个亲爱的)
int i = refVal; //实际上,i = ival,同上
提个问题:能不能定义引用的引用,即:
int ival = 1024; //定义算术类型int,变量名为ival
int &refVal = ival; //refVal为ival的别名
int &refVal4 = &refVal //这样可以吗????
//VSCode的编译结果:
//非常量引用的初始值必须为左值
答案是:不能
具体原因涉及到C++拷贝临时对象的问题,这里不深入讨论,感兴趣的可移步链接:非常量引用的初始值必须为左值的问题
特别注意的点
- 所有引用的类型都必须和与之绑定的对象严格匹配
- 引用只能绑定在对象上,而不能与字面值或者某个表达式的计算结果绑定在一起
(具体原因后面的文章会分析)
代码分析:
int &refVal5 = 10; //错误:引用类型的初始值必须是一个对象
double dval = 3.14;
int &refVal6 = dval; //错误:此处引用类型的初始值必须是int型对象
以上,就是复合类型中,关于引用的学习,这里尽可能简单的介绍,随之学习的深入,会对其中包含的底层代码,慢慢剖析。
希望对你的学习有所帮助:)