【C++】const限定符|const引用

const的引用

说const引用之前需要说明,这是建立在引用的前提下,如果是普通的拷贝赋值就基本不需要使用到const(有关权限)。

1 权限不能放大(可平移、缩小)

如何解释权限不能放大? 阅读下面的代码

可以看到:

a是const int 类型,是只读的。

b是int类型,是可读可写的,要绑定a(意味着b想修改自己的时候会将a一起修改,但是我们知道,a是只读的,不能修改),会出错。

什么是权限的放大?

只读 --> 可读可写

权限不能放大,但是可以平移,所以下面的代码就是正确的。

什么是权限的平移?

只读 ---> 只读

可读可写 -->  可读可写

如果是权限的缩小,代码也可以通过

什么是权限的缩小?

可读可写 ---> 只读

如果是拷贝,就没有权限的概念!!!

b是a的拷贝,b的改变不会影响到a,所以就算a是只读的,b是可读可写的,也不会有问题。

根本的原因就是:b是a的拷贝,b的改变不会影响到a.

1.1 临时对象具有常性

临时对象具有常属性,本文谈及两个方面:

1.类型转换

2.函数创建栈帧返回的临时变量

1.1.1 隐式类型转换

为什么类型转换会产生临时变量?

上面的代码,a是int类型,b是double类型。

当运算符两边的变量类型不同时,会发生类型提升(提升有自己的规则,感兴趣的可以搜一下,本文这个不是重点,所以不讲)

a是int类型,占4个字节

b是double类型,占8个字节

当比较的时候,发生提升。不是直接将a的值发生改变,是创建一个新的临时变量,将临时变量提升为8个字节的double类型,将临时变量和值和b进行比较。

既然当运算符两边的变量类型不同时,会发生类型提升。那么,赋值运算符也属于其中,所以也会发生提升,也会产生临时变量 --> 临时变量具有常性。

上面的代码编译会出错,为什么呢?

因为a是int类型,将int类型转化为double类型,会产生临时变量,临时变量具有常性。将const double类型变量转化double类型,是权限的放大!所以会出错。

而如果将b前面加上const,就能编译通过:

临时变量具有常性,是const double类型,而b是const double类型。这是权限的平移。

1.1.2 函数传值返回是临时变量

1.2 const引用做函数形参

什么时候会给函数传参用引用?

当传递的内容空间占用比较大的时候,因为如果是传值传参,就是拷贝一份;而如果是传引用,就是传别名,就是拷贝,效率就会提高

上面的代码为什么会出错?

因为传递形参的类型是string类型,而"hella"和"hello"是const string类型,这属于权限的放大!            、

改进的方式有两个:

1.将引用去除,直接传递拷贝。  因为拷贝不涉及权限问题

2.加上const,实现权限的平移。            

结论:当定义函数形参的时候,如果确定这个函数不会修改实参的内容,就应使用const&。

这样做的好处:

1.传递引用可以减少拷贝,提高效率

2.使用const引用,既可以传递const类型的变量,也可以传递非const类型的变量。而使用非const引用,就只能传递非const引用。

2 const指针

小技巧:从右往左读,看const离谁近!

第一个p1中:const离p1近(离指针近) 代表不能修改的值是指针本身,本例中是p1。

因为指针本身不能修改,所以p1只能一直指向a(p1的指向不能改变)。但是*p1是可以改变的。

p1的指向不能改变!

但是p1所指向的变量的内容是可以改变的!

第二个p2中:const离*近(离*p2近,就是解引用)代表不能修改的值是指针解引用,也就是指针所指向的值。

不能修改*p2的值!

p2的值可以变,也就是说,p2可以改变指向!

总结:

1. int* const p1表示指针本身是一个常量 - - - - 因为const修饰的是指针

2. const int* p2表示指针所指向的对象是常量 - - - - 因为const修饰的是指针的解引用

2.1 顶层const

顶层const(top-level const) 表示指针本身是个常量

我们可以理解为:顶层const ---> const离p近

2.2 底层const

底层cosnt(low-level const)表示指针所指向的对象是常量

我们可以理解为:顶层const ---> const离*p近

为什么第一个不能通过编译?

因为p1是底层const,

*p1的值不能改变,而int* p2是int*类型,可以改变p2所指向的内容,属于权限的放大!

为什么第二个可以通过编译?

因为p3是顶层const,

不能改变的是指针本身,指针所指向的内容是可以改变的。

p4是int*类型,可以改变指针所指向的内容,属于权限的平移!

const修饰this指针

使用const修饰this指针的时候,将成员函数变成常成员函数了。

意义:方式程序员不小心修改数据成员的值!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/291569.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sadtalker学习用于风格化音频驱动单图像说话人脸动画的真实 3D 运动系数的应用

论文出处 https://arxiv.org/abs/2211.12194 使用方法 1. 打开项目的colab链接 https://colab.research.google.com/github/Winfredy/SadTalker/blob/main/quick_demo.ipynb#scrollTofAjwGmKKYl_I 在examples/source_image文件夹中添加希望动起来说话的图片,这…

基于GA遗传优化的离散交通网络双层规划模型设计matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于GA遗传优化的离散交通网络双层规划模型设计.优化输出路段1和路段2的收费情况收敛过程。 2.测试软件版本以及运行结果展示 MATLAB2022a版本运行 3.核心程序…

组蛋白脱乙酰酶介导的胃癌肿瘤微环境特征及协同免疫治疗(多组学文献学习)

目录 ①HDAC转录组多数据NMF一次聚类 ②ACRG队列中HDAC单独NMF聚类 ③HDS评分在胃癌中的临床特征和基因组特征 ④高 HDS 可能提示胃癌的“热”肿瘤状态 ⑤HDS是胃癌免疫治疗效果的有力预测指标 ⑥单细胞转录组测序揭示了高HDS和低HDS患者的TME ⑦内皮细胞和成纤维细胞可…

BGP实训

BGP基础配置实训 实验拓扑 注:如无特别说明,描述中的 R1 或 SW1 对应拓扑中设备名称末尾数字为 1 的设备,R2 或 SW2 对应拓扑中设备名称末尾数字为2的设备,以此类推;另外,同一网段中,IP 地址的主…

web学习笔记(四十五)Node.js

目录 1. Node.js 1.1 什么是Node.js 1.2 为什么要学node.js 1.3 node.js的使用场景 1.4 Node.js 环境的安装 1.5 如何查看自己安装的node.js的版本 1.6 常用终端命令 2. fs 文件系统模块 2.1引入fs核心模块 2.2 读取指定文件的内容 2.3 向文件写入指定内容 2.4 创…

git下载安装教程

git下载地址 有一个镜像的网站可以提供下载: https://registry.npmmirror.com/binary.html?pathgit-for-windows/图太多不截了哈哈,一直next即可。

鸿蒙 UIAbility和Compent 生命周期

一、UIAbility的生命周期 在UIAbility的使用过程中,会有多种生命周期状态,掌握UIAbility的生命周期,对于应用的开发非常重要。 1、UIAbility的生命周期 UIAbility的生命周期主要分为以下4个: Create---Foreground---Background---…

RabbitMQ 延时消息实现

1. 实现方式 1. 设置队列过期时间:延迟队列消息过期 死信队列,所有消息过期时间一致 2. 设置消息的过期时间:此种方式下有缺陷,MQ只会判断队列第一条消息是否过期,会导致消息的阻塞需要额外安装 rabbitmq_delayed_me…

C++从入门到精通——缺省参数

缺省参数 前言一、缺省参数概念二、缺省参数分类位置参数的缺省参数全缺省参数半缺省参数 关键字参数的缺省参数函数指针的缺省参数lambda表达式 三、缺省参数的具体代码展示main.cpp 前言 缺省参数是在函数定义时指定的默认值,当调用函数时未提供该参数的值时&…

暴雨服务器X7740赋能大模型训练

数字经济浪潮愈演愈烈,大模型训练对服务器的要求也越来越高。在此背景下,暴雨信息发布专门为大规模模型训练而设计的全新旗舰GPU服务器—X7740,以卓越的计算性能、高速网络通信能力以及创新的能效表现,有效赋能大模型训练。 X7740 搭载了暴雨信息最新一代的英特尔至强可扩展处理…

如何划分训练集、测试集、验证集

训练集、测试集和验证集是在机器学习和数据科学中常用的术语,用于评估和验证模型的性能。它们通常用于监督学习任务中。 1. 训练集(Training Set):训练集是用于训练机器学习模型的数据集。在训练期间,模型使用训练集中…

Leetcode - 周赛390

目录 一,3090. 每个字符最多出现两次的最长子字符串 二,3091. 执行操作使数据元素之和大于等于 K 三,3092. 最高频率的 ID 四,3093. 最长公共后缀查询 一,3090. 每个字符最多出现两次的最长子字符串 本题是一道标准…

嵌入式C语言中头文件计设规则方法

我是阿梁,最近在负责的项目代码,也算是祖传代码了,里面有很多头文件嵌套的情况,即a.h包含b.h,b.h又包含c.h,c.h又包含d.h......遂找到一份华子的C语言编程规范学习一下,并结合自己的理解写成这篇文章,以规范自己的代码。 1. 头文件嵌套的缺点 依赖:若x.h包含了y.h,则…

启信宝商业大数据助力全国经济普查

近日,合合信息旗下启信宝收到中国青年创业就业基金会感谢信,对启信宝协同助力全国经济普查和服务青年创业就业研究表达感谢。 第五次全国经济普查是新时代新征程上一次重大国情国力调查,是对国民经济“全面体检”和“集中盘点”,…

武汉星起航:亚马逊受惠国家政策,企业成长与行业发展齐头并进

亚马逊电商平台作为国际知名的跨境电商巨头,在中国市场也展现出了强劲的发展势头。近年来,国家政策对亚马逊电商平台的支持力度不断加大,为企业提供了良好的发展环境和机遇。武汉星起航将探讨国家政策对亚马逊电商平台的重要影响,…

深度思考:雪花算法snowflake分布式id生成原理详解

雪花算法snowflake是一种优秀的分布式ID生成方案,其优点突出:它能生成全局唯一且递增的ID,确保了数据的一致性和准确性;同时,该算法灵活性强,可自定义各部分bit位,满足不同业务场景的需求&#…

QT使用数据库

数据库就是保存数据的文件。可以存储大量数据,包括插入数据、更新数据、截取数据等。用专业术语来说,数据库是“按照数据结构来组织、存储和管理数据的仓库”。 什么时候需要数据库?在嵌入式里,存储大量数据,或者记录数…

【项目技术介绍篇】若依开源项目RuoYi-Cloud后端技术介绍

作者介绍:本人笔名姑苏老陈,从事JAVA开发工作十多年了,带过大学刚毕业的实习生,也带过技术团队。最近有个朋友的表弟,马上要大学毕业了,想从事JAVA开发工作,但不知道从何处入手。于是&#xff0…

双端队列deque和vector以及list的优缺点比较

参考:https://blog.csdn.net/TWRenHao/article/details/123483085 一、vector vector具体用法详情点这里 优点: 支持随机访问 CPU高速环缓存命中率很高 缺点: 空间不够,便需要增容。而增容代价很大,还存在一定的空间浪费。 头部…

在同一个网站上自动下载多个子页面内容

一、问题现象 第一次遇到这样的问题,如下图: 即在同一个网站上下载多个内容时,第一个内容明明已经正常get到了,但开始第二个页面的查询 以后,原来已经查出的内容就找不到了。 二、解决办法 我不知道大家是不是遇到…