C++初识--------带你从不同的角度理解引用的巧妙之处

1.对于展开的理解

我们这里的展开包括命名空间的展开和头文件的展开,两者的含义是不一样的:

头文件的展开就是把头文件拷贝到当前的文件里面;

命名空间的展开不是拷贝,而是因为编译器本身默认是到全局里面去找,当我们的命名空间展开之后,就授权可以到命名空间里面去查找。

我们在一般进行练习的时候,为了简便,我们会使用using namespace std就相当于授权访问库里面的内容,但是在项目里面,我们一般不会这样做。

2.引用在顺序表和链表里面的运用

我们之前在实现链表的时候,我们在之前是使用二级指针在链表的尾部插入数据,如果不是二级指针的话就会使得实参无法同步,但是有了引用之后,我们可以使用引用实现二级指针的功能。

(1)引用在定义的时候必须进行初始化;

(2)一经引用就不能改变指向;

(3)一个变量是可以有多个引用的;

引用作为返回值:

int ret就是把n的别名直接返回给ret所以两次打印的结果都是1;

这个地方是int &ret,相当于ret是n的别名,cout会创建栈帧,这个时候可能还会打印1,第二次进行打印就是第一次覆盖的结果,所以第二次会打印随机值;

调用函数cout创建的栈帧可能会很大,当我们的count函数的前面有比如int a[1000],这个时候即使覆盖可能也只回覆盖掉数组,可能不会影响我们的ret,所以不一定会被覆盖;

出了作用域,没有还给系统,就可以使用引用返回,否则就不能够使用引用返回。

下面的是顺序表里面的引用:

我们在实现顺序表的查找数据和修改数据的时候,是使用了2个函数进行的:seqlistfind和seqlistmodify函数

使用引用的话,只使用一个函数就可以同时实现查找数据和修改数据的功能。这个里面我们使用的是引用,ps相当于就是我们的结构体s1的别名,我们的返回值相当于是ps.a[i]的别名,这个时候我们可以同时实现修改和查找,怎么实现的呢?如果想要查找,我们就可以直接打印对应的下标,修改的话我们就可以直接赋值,根据引用的特性进行修改,打印的结果就是引用修改之后的数值,如果没有赋值,我们就可以找到顺序表里面的值,这样话,我们使用一个函数加上引用就可以实现想要查找就输出里面的值,想要修改就输出修改之后的数值。

不加引用是否可以实现,我们可以实践一下:

显然,我们可以观察到,这个是不可行的,为什么会出现这个报错?因为如果我们不使用引用返回,相当于我们返回的就是一个ps.a[i]的拷贝,这个拷贝具有常属性,我们对他可以惊醒打印输出,但是不可以进行修改;如果我们使用引用,相当于得到的就是别名,我们是可以进行修改的。

3.引用的权限问题

下面的就是引用的3种不同的权限:权限的平移,权限的放大,权限的缩小;

显然权限的缩小以及权限的平移是正确的,权限的放大是不允许的,在下面的例子里面a原来的是const int类型,使用别名b之后就是int类型,显然是放大了权限,因为之前的a带有const修饰,是不可以改变的,但是我们的b就是简单的int类型,是允许修改的。

我们使用相同的const int的类型的c进行接收就是权限的平移,是可以的;

我们之前的d是int类型,但是其别名f是const int 类型,显然是可以的,这个就是权限的缩小。

4.利用引用的权限解释一个现象

上面的就是一个使用引用的权限就可以进行解释的现象:

第一个就是一个简单的函数的调用,使用ret接受函数的返回值;

第二个使用了引用,这里会报错,原因就是我们的函数调用完成之后,会产生临时变量,临时变量的值给了ret,临时变量具有常数性,我们的ret是不具有的,这里就可以简单的理解为把原来的临时变量的常属性权限房放大为ret的可修改的权限,相当于是权限的放大,所以会报错;

第三个我们使用const修饰之后,这个报错就解决了,因为我们的临时变量具有常属性,我们的ret使用const进行修饰了之后,同样也是不可以进行修改的,这个就可以理解为权限的平移,所以是正确的;

实际上我们加上const进行修饰之后,这个临时变量的生命周期就被延长了,只有我们的ret使用完成之后,这个临时变量才会被销毁。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值