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

news2024/11/28 20:36:36

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.coloradmin.cn/o/1556413.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Taskflow:子流任务(Subflow Tasking)

创建Subflow DAG任务中,有一种常见的场景,一个任务可能在执行期间产生新的任务,然后紧接着执行新任务。 之前提到的静态图就没有办法实现这样一个功能了,所以Taskflow提供了另一种流的节点:Subflow,Subflo…

多张图片怎么合成一张gif?快来试试这个方法

将多张图片合成一张gif动图是现在常见的图像处理的方式,适合制作一些简单的动态图片。通过使用在线图片合成网站制作的gif动图不仅体积小画面丰富,画质还很清晰。不需要下载任何软件小白也能轻松上手,支持上传jpg、png以及gif格式图片&#x…

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

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

meanshift论文学习

1. abstract 2. 理论解读 目标函数 然后对(11)求导,求解x,x实际就是求解当图像位置的值,求导之后表示为: 进一步整理得: 上式第二项即为meanshift 进一步整理为 上式表明了均值漂移与核函数之间的关系。 3. 缺点…

多语言多货币多入口FecMall跨境电商B2C商城系统源码

FecMall是一套多语言多货币多入口的开源电商 B2C 商城,支持移动端vue, app, html5,微信小程序微店,微信小程序商城等。很适合用来做跨境电商外贸独立站。 Fecmall 全称为Fancy ECommerce Mall,是基于php Yii2框架之上开发的一款优…

基于ssm中国咖啡文化宣传网站的设计与实现论文

摘 要 本课题是根据咖啡文化宣传需要以及网络的优势建立的一个中国咖啡文化宣传网站,来实现中国咖啡文化宣传以及咖啡商品售卖的功能。 本中国咖啡文化宣传网站应用Java技术,MYSQL数据库存储数据,基于SSMVue框架开发。在网站的整个开发过程中…

Filter、Listener、AJAX、Vue、Element

Filter 概念:Filter 表示过滤器,是JavaWeb三大组件(Servlet、Filter、 Listener)之一。 过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能。 过滤器一般完成一些通用的操作,比如:权限控制、统一编码处理、敏感…

Gitea 的详细介绍

什么是 Gitea? Gitea 是一个开源、轻量级的自托管 Git 服务,它允许用户搭建类似于 GitHub 或 GitLab 的代码托管平台。由于采用 Go 语言开发,Gitea 具有高效的性能和跨平台特性,适合个人开发者或小团队使用。 Gitea 的特点 轻量…

pycharm修改主题颜色和注释颜色

目录 一、修改主题颜色 二、修改注释颜色 一、修改主题颜色 总结的来说就是:File-Settings-Appearance-Theme。 有三种主题: Darcula:默认主题,可以看作是黑的: IntelliJ Light:可以看作是白的: High con…

在新能源充电桩、智能充电枪、储能等产品领域得到广泛应用的两款微功耗轨至轨运算放大器芯片——D8541和D8542

D8541和D8542是我们推荐的两款微功耗轨至轨运算放大器芯片,其中D8541为单运放, D8542为双运放,它特别适用于NTC温度采集电路、ADC基准电压电路、有源滤波器、电压跟随器、信号放大器等电路应用,在新能源充电桩、智能充电枪、…

JavaScript练手小技巧:仿米哈游官网人物跟随鼠标位移效果

最近,有同学找到我,说:老师,我想模仿米哈游官网。 我说:可以,很不错的。 她说:有些效果有点难,能不能帮我看下。 于是,我就简单大概粗糙的讲解了下大致的原理&#xf…

unity学习(78)--unity调试--长痛不如短痛

1.在vs2022中,工具--获取工具与功能。 2. 安装图中工具,原来我早就安装了。 3 f9下断 同时点击图中按钮 vs此时变为如下状态 unity中出现如下提示: 4 在unity中运行游戏,vs这边确实成功断住了!

柔数组的介绍

柔数组简单介绍 这个词你可能没有听过但是他的确是存在的。 1.在c99中结构中的最后⼀个元素允许是未知⼤⼩的数组,这就叫做『柔性数组』成员 2这就代表了它存在与结构体中,很重要的一点是,他只能是结构体的最后的一个成员,这是…

面向对象特征二:继承

继承的概述 生活中的继承 财产继承: 绿化:前人栽树,后人乘凉 “绿水青山,就是金山银山” 样貌: 继承之外,是不是还可以"进化": 继承有延续(下一代延续上一代的基因、财…

动态内存管理【malloc,calloc,realloc和free的理解】【柔性数组的概念】

一.为什么要有动态内存分配 我们知道,当我们创建变量的时候,我们会向系统申请一定大小的空间内存。比如int a10或者int arr[10];我就向内存申请了4或者40个字节的大小来存放数据。但是当我们一旦申请好这个空间,大小就无法调整了…

Linux部署Kafka2.8.1

安装Jdk 首先确保你的机器上安装了Jdk,Kafka需要Java运行环境,低版本的Kafka还需要Zookeeper,我此次要安装的Kafka版本为2.8.1,已经内置了一个Zookeeper环境,所以我们可以不部署Zookeeper直接使用。 1、解压Jdk包 t…

缓存和缓存的常用使用场景

想象一下,一家公司在芬兰 Google Cloud 数据中心的服务器上托管一个网站。对于欧洲用户来说,加载可能需要大约 100 毫秒,但对于墨西哥用户来说,加载需要 3-5 秒。幸运的是,有一些策略可以最大限度地减少远程用户的请求延迟。 这些策略称为缓存和内容交付网络 (CDN),它们是…

HarmonyOS实战开发-使用List组件实现导航与内容联动的效果。

1 卡片介绍 使用ArkTS语言,实现一个导航与内容二级联动的效果。 2 标题 二级联动(ArkTS) 3 介绍 本篇Codelab是主要介绍了如何基于List组件实现一个导航和内容的二级联动效果。样例主要包含以下功能: 切换左侧导航&#xff…

OSCP靶场--Sorcerer

OSCP靶场–Sorcerer 考点(feroxbuster目录扫描zip包隐藏文件发现公钥私钥公钥覆盖私钥登陆suid start-stop-daemon提权) 1.nmap扫描 ## ┌──(root㉿kali)-[~/Desktop] └─# nmap 192.168.216.100 -sV -sC -Pn --min-rate 2500 -p- Starting Nmap 7.92 ( https://nmap.or…

nodejs下载安装以及npm、yarn安装及配置教程

1、nodejs下载安装 ​ 1.1、使用nodejs版本管理工具下载安装,可一键安装、切换不同nodejs版本, nvm-setup.zip:安装版,推荐使用 本次演示的是安装版。 1、双击安装文件 nvm-setup.exe 选择nvm安装路径 例如:E:\Soft…