细讲const与引用&的关系

细讲const与引用&的关系_第1张图片

目录

先了解语言层面的权限

进入正题引用与const权限关系

引用权限的概念

const引用返回值时错误情况

一:返回到临时空间时权限问题

二:临时空间到调用处保存问题

结论:如果不对子函数内部数据修改、那么在父函数变量ret的类型可以设置为const type&接收任何的返回值,然后再赋值给其他变量。

权限题外话


先了解语言层面的权限

再语言层面其实也有一些权限的

细讲const与引用&的关系_第2张图片

常量的数据不可被普通的pch指针指向,必须将pch类型改为const char*类型

既然指针这样是有权限的限制的,那么引用其实也有权限限制。

引用又不是指针为什么呢?看我的另一篇文章的最后部分(3条消息) C++|引用篇_云的小站的博客-CSDN博客

进入正题引用与const权限关系

引用权限的概念

看代码

细讲const与引用&的关系_第3张图片

这里我们讲解一些引用权限

第一块:权限的平移,a为可读可写,ra可读可写----允许权限平移

第二块:权限的缩小,a为可读可写,ra可读不可写----允许权限缩小

第三块;权限的平移,a为可读不可写,ra可读不可写----允许权限平移

第四块:权限的放大,a为可读不可写,ra可读可写----不允许权限发大

总结:引用变量权限只能缩小或者相同,不能放大


const引用返回值时错误情况

一:返回到临时空间时权限问题

细讲const与引用&的关系_第4张图片

 错误点:

细讲const与引用&的关系_第5张图片

 函数内_a权限为可读不可写,但是临时空间引用为可读可写,权限放大了

正确一: 

细讲const与引用&的关系_第6张图片

 将临时空间改为const int&类型,保证了临时空间不权限放大。

正确二:

细讲const与引用&的关系_第7张图片

让返回值以拷贝的方式赋值到临时空间 (临时空间数据变为常性,接收处引用需要加const)

二:临时空间到调用处保存问题

细讲const与引用&的关系_第8张图片

 这里就有许多的问题了

第一个问题:

细讲const与引用&的关系_第9张图片

func return 的数据是以拷贝的方式到临时空间,临时空间保存的值是具有常性的

这里相当于ret引用了一个常量  int& = “常量”错误的

正确修改一:对临时空间操作

细讲const与引用&的关系_第10张图片

 临时空间从拷贝返回值数据改为了临时空间应用返回值数据(引用返回值权限为偏移),权限偏移到临时空间,然后在ret在引用临时空间,也就是引用_a变量。

正确修改二:对调用接收处操作

细讲const与引用&的关系_第11张图片

我们知道,当临时空间拷贝数据后,后临时空间变为常性,所以引用该具有常性的数据需要加const

第二个问题: 

细讲const与引用&的关系_第12张图片

由于_a为const常变量,所以函数先引用返回,那么返回类型必须是const

ret为int&引用const int&tmp(临时空间)发生了权限放大的错误。

正确:将ret权限缩小

细讲const与引用&的关系_第13张图片

 这里ret的权限于tmp相等,所以发生权限偏移可以的。

结论:如果不对子函数内部数据修改、那么在父函数变量ret的类型可以设置为const type&接收任何的返回值,然后再赋值给其他变量。


权限题外话

看代码为什么double类型可以赋值给a呢

double b=10.5;
int a = b;

不同类型会生成临时空间,空间内的数据是不可修改的常量,类型为被赋值的数据类型

细讲const与引用&的关系_第14张图片

再tmp中被截断为常量数据int,再传入a数据

细讲const与引用&的关系_第15张图片

引用操作就是,给一块空间起别名,

double b=10.5;
int&a = b;//会报错!

为什么会报错呢,其实这里就是权限发大的原因

细讲const与引用&的关系_第16张图片

b生成tmp空间数据,而数据是具有常性的不可被修改,但是int &a是可被修改int类型变量的引用,

细讲const与引用&的关系_第17张图片

就是给了一个常量取了一个可以修改的别名,所以会报错,所以我们要将别名的类型改变为,常变量别名,const int&类型,这就可以给常量起一个常变量类型的别名

正确:

double b=10.5;
const int&a = b;

ps:表达式和类型转换会产生临时空间,存放常型数据

结论:const Type &可以接收各种各样的类型

你可能感兴趣的:(c++,算法,数据结构)