首页 > 编程语言 >【C++】关于常引用的问题 #什么是权限放大?权限放小?隐式或强制转换居然还有这一步?...#

【C++】关于常引用的问题 #什么是权限放大?权限放小?隐式或强制转换居然还有这一步?...#

时间:2023-07-03 21:31:42浏览次数:72  
标签:...# const int C++ 别名 ra rb 权限

前言

引用c++中的使用非常常见,可以说是很重要的,引用常引用相关的问题让很多人稍不留神就出错了,这里我们就来谈谈常引用的问题。

关于权限

  • 关于权限有权限缩小权限放大的问题,比如一个文件,当初它只有的权限,而现在你给它再加个的权限,这就是权限放大;又或当初它读,写的权限都有,但你把他某个权限或所有权限都限制了,这就是权限缩小
  • 指针引用赋值中,权限可以缩小,但不可以放大:这里通常指的是变量的值可不可以改的问题,如果说是从改到不能改,这就是将权限缩小了,这是可行的;如果说是从不能改到能改,这就是权限放大了,此时是不行的。
  • 而引用相当于起别名,对于这个别名的权限相对于本名变量有什么变化,这需要自己来决定。当自己决定别名的权限之后(不能与第二点表达的起冲突),对它的使用就要留个心眼

关于引用与const

const通常就是用来限制变量可以改,也就是这个变量的值不能被修改,结合上面的权限问题,我们来看以下例子:

1.
int a = 10;
const int& ra = a;  // ??
int& raa = ra;  // ??

2.
const int b = 20;
int& rb = b;  // ??
const int& rrb = b;  // ??
  • 对于上述代码的第一种情况:

    1. 关于raraa的别名,并且被const修饰,此时ra的值是不能被修改的(要注意,这里单指ra,只是说不能使用raa的值进行修改,使用a修改值还是可以的,注意是单指ra这个别名),由ara,很明显改的权限没了,属于权限变小,是可行的。
    2. 关于rrarrara的别名,也就是a的别名的别名,本质还是一样的,只不过说,rra是相对于ra起的别名,ra的权限不能改,而rra前面没有const(能读能改),所以由rarra属于权限放大,是不可行的。
  • 对于上述代码的第二种情况:

    1. 关于 rbrbb的别名,b前面使用了const修饰,说明它不能被修改,而rb前面没有const,说明可读可改,属于权限放大,是不可行的。
    2. 关于rrbrrb也是b的别名,b前面使用了const修饰,rrb前面也使用了const修饰,权限没有变,当然可行。

当我们在使用引用的时候,若是有const出现,那一定要注意权限的问题,不然程序写完一运行全是问题。

关于那秘密的一步

这秘密的一步还是与权限有关,居然是与权限有关,那么指向的对象就只有指针和引用了。

对于这秘密的一步,我们先来看以下例子:

	double b = 13.14;

//1.
	int a = b;  // 隐式类型转换
	int c = (int)b;  // 强制类型转换

//2.
	// 2.1. // 隐式类型转换
	int& rb = b;   // 出错   
	const int& rrb = b;
	// 2.2.  // 强制类型转换
	int& rrrb = (int)b;   // 出错
	const int& rrrrb = (int)b;
  • 情况1:对于情况1,据前面的概念,变量ac既不是指针也不是引用,所以这里当然是可行的。
  • 情况22.1rbb的别名,只不过rb的类型是(int),b的类型是(double),所以b发生了隐式类型转换,那么这里为什么会出错呢?就是因为那秘密的一步:<font color=blue size=5>b的隐式类型转换,转换后的值会先交给一个临时变量tmp(此时tmp变为13),而语法规定,这个tmp是一个常量,当tmp的值再交给rb时,rb是一个别名,前面没有const修饰,具有改的权限,所以这里权限是放大了的,是不可行的。也因此这里会出错。</font>而下一条语句,rrb前面有const修饰,所以没有出错。 2.2:有了2.1的铺垫,实际上强转不强转的无所谓,最终还是归咎到有关const权限问题,所以要理解那个tmp,也因此这里的rrrb会出错。

当然,对于函数调用,也有相关问题:

1.
void fun(int& rb)  // 权限放大,不行
{
	cout << rb << endl;
}

double b = 13.14;
fun(b); // 隐式类型转换交给一个临时变量,这个临时变量是常量

2.
void fun(const int& rb)  // 权限不变,可行
{
	cout << rb << endl;
}

double b = 13.14;
fun(b); // 隐式类型转换交给一个临时变量,这个临时变量是常量
  • 无论是函数的传参还是返回,都存在那个临时变量的问题,规定了临时变量是一个常量,那就要小心这个点带来的问题。

  • 对于1,2,关注的点还是一样的,都是围绕一个权限的问题,所以当我们在对函数传参或者是接收函数返回值的时候,要注意要不要加const,这样才能在小的细节上不会出错。

写在最后

最后还是要强调,关于本章内容,一定要清楚,不能搞混,谁知道在以后写代码的时候会不会出类似错误呢?而一旦出现此类的问题,那就很难受了。可能一时半会都想不清楚到底是哪出了问题。

感谢阅读本小白的博客,错误的地方请严厉指出噢!

标签:...#,const,int,C++,别名,ra,rb,权限
From: https://blog.51cto.com/u_16019252/6615959

相关文章

  • 11.既然有了malloc-free,C++中为什么还需要new-delete呢?直接用malloc-free不好吗?
    malloc/free和new/delete都是用来申请内存和回收内存的。在对非基本数据类型的对象使用的时候,对象创建的时候还需要执行构造函数,销毁的时候要执行析构函数。而malloc/free是库函数,是已经编译的代码,所以不能把构造函数和析构函数的功能强加给malloc/free,所以new/delete是必不可少......
  • 文件权限
    linux文件权限一、linux文件权限1、权限关联对象u#ower属主g#group属组o#other其他a#all所有人2、文件权限字母表示r#Read读取cat、more、less、head、tailw#Write写入echo追加、vim编辑、cat重定向,修改文件属性、mv改名字,修改文件权限x#......
  • C++学习笔记
    类型兼容不同类型的数据在一定条件下可以进行转换,比如intn='a',是将字符'a'赋值给整型变量n,在赋值过程中发生了隐式类型转换,字符类型的数据转换为整型数据。这种现象称为类型转换,也称为类型兼容。继承与派生继承方式public继承private继承protect继承类型兼容在C++中,基类与派生......
  • C++ 宏定义
    看到一段C++代码,大致是说如果如果定义了RUN_ALL_TESTS就执行下面的代码,遂研究了一下。#ifdefined(RUN_ALL_TESTS)//somecodehere#endif首先RUN_ALL_TESTS是定义的宏:#defineRUN_ALL_TESTS//空字符串#defineRUN_ALL_TESTS1//赋值为1#ifdefined......
  • Inno setup 脚本判断 Microsoft Visual C++ Redistributable 不同版本区别
    有个需要是需要在安装包安装初始化时安装MicrosoftVisualc++2013Redistributable也就是判断软件安装前需不需要运行vcredist_x64.exe和VC_redist.x64.exe这两个程序第一反应就是可以通过注册表判断是否已经安装过环境但测试发现需求的两个版本不同,注册表位置竟然也不......
  • 《深入探索C++对象模型》- 第二章 - 构造函数语义学 - 笔记
    PDF版本https://www.aliyundrive.com/s/oQJJiJfQmU2......
  • superset(二)基本使用详细示例以及superset权限控制介绍
    Superset系列文章superset(一)详细部署步骤(python3.7.15、windows11)及验证异常处理superset(二)基本使用详细示例以及superset权限控制介绍(文章目录)本文简单的介绍了superset的基本使用步骤的示例,以及superset的权限控制。本文部分数据来源于互联网。本文分为2个部分,即通......
  • C++面试记录——2023.7.3
    1、什么是虚函数?(基础反而卡住了,往多态方面说了)  2、虚函数实现原理?(不知道) 3、什么是完美转发?(没学深,浅浅说了跟右值引用相关) 4、构造函数有哪些?(默认、带参、拷贝、移动) 5、现有一个右值变量,如何调用移动构造函数?(麻了,不会) 6、知道lambda表达式吗?(C++11特性,匿......
  • 直播软件开发,TextView内容过多,超过n行显示“...全文”
    直播软件开发,TextView内容过多,超过n行显示“...全文” /**   *TextView超过两行,末尾显示"...全文"   *为避免抖动,需在xml中设置TextView的maxHeight   *@parammaxLine最多几行   *@paramstrNum 末尾显示字符数   *@paramstr 末尾显示字......
  • 文件权限
    linux文件权限一、linux文件权限1、权限关联对象u#ower属主g#group属组o#other其他a#all所有人2、文件权限字母表示r#Read读w#Write写x#Execute执行3、权限数字表示r——4w——2x——14、linux文件类型文件属性文件类型......