重学C++系列——复合类型之引用

重学C++系列——复合类型之引用

引用

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型对象

以上,就是复合类型中,关于引用的学习,这里尽可能简单的介绍,随之学习的深入,会对其中包含的底层代码,慢慢剖析。

希望对你的学习有所帮助:)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值