目录
结论:如果不对子函数内部数据修改、那么在父函数变量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 &可以接收各种各样的类型