> 文章列表 > 细讲const与引用的关系

细讲const与引用的关系

细讲const与引用的关系

目录

先了解语言层面的权限

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

引用权限的概念

const引用返回值时错误情况

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

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

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

权限题外话


先了解语言层面的权限

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

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

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

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

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

引用权限的概念

看代码

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

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

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

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

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

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


引用数据传入的一些问题

一、实参类型匹配,但不是左值(该地址空间下实际可修改)

 正确:接收出改为const int&类型

因为10这个数据是常量,函数普通引用常量是非法的,必须加上const。

如果实参数据类型不匹配,而且不是左值就会产生隐式

 二、实参是左值,但是类型不正确。

 正确:同一正确

为什么加上const就正确了呢?

这里其实发生产生临时空间保存数据!!后面->权限题外话<中有这方面的介绍。

 

const引用返回值时错误情况

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

 错误点:

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

正确一: 

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

正确二:

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

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

 这里就有许多的问题了

第一个问题:

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

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

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

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

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

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

第二个问题: 

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

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

正确:将ret权限缩小

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

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


权限题外话

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

double b=10.5;
int a = b;

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

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

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

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

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

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

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

正确:

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

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

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