C++浅谈const

news2024/12/26 12:47:24

在学C++的时候,必不可少的是const,他或许在C语言中是可有可无的,但是在C++中绝对不是,我们在学习C语言的时候,我们知道的是,经常有人说加const是为了保证“安全”,那么,所谓的“安全”是什么呢?其实,这里的安全相信大家也是全部知道的,有些人或许心里会想,不就是保证数据不被更改吗?这有什么的,没错,是为了保证数据不被更改,但是,我想在这里说的是,你知道什么时候加const吗?总有迷糊的时候,今天在写模拟实现STL中的list的时候,我突然有点迷糊。大家看看下面的这个代码:

 

我在两个const_iterator的前面画了两个箭头,大家觉的在两个前面带要不要加const呢?我想说的是,其实我自己刚开始也是很迷糊,我也不知道到底加不加,但是,我刚刚突然想到的是,其实加不加都不影响,这又是为什么呢?为什么我又说加不加不影响。我不知道大家想过没有,当你正在纠结这里到底要不要加const的时候,其实大部分都是写到了这个代码(不知道大家有没有写过这个代码,反正我是写到了):

 不知道有没有兄弟这样写过,刚开始我想的浅,因为是const的list,所以迭代器只能用const_iterator,所以这个返回的也是const_iterator的,所以我就想的是让其引用,但是我写了这个代码,才发现错了,那么,错哪了呢?两个类型都是一样的,我仔细想了之后,才发现,这里是传值返回啊,会出现一个临时变量,临时变量具有常性,我感觉突然拨云见日,但是如果这样写,还有一个小错误,虽然编译可以通过,但是我不知道大家想过没有,其实   “严格”来说,我个人认为是有内存泄漏的。那么肯定又有人迷糊了,又是拿来的内存泄漏呢?其实在他产生临时变量的时候,他会进行拷贝构造,而我们没有写拷贝构造函数,所以他会进行浅拷贝,浅拷贝正好符合我们的心意,我们这里用了一个匿名的类,所以会自动析构,这不用我们说。所以这里的这个引用就是引用的是临时变量,是这个临时变量的别名,而这个临时变量不会一直存在,他返回之后会消除,但是你运行的时候还是正常运行,这个又是为什么呢?因为他这个类的成员变量是在堆区开辟的,而又因为我们这里没有析构函数,所以就没有释放这个申请的空间。(此处的内存泄漏是自我认为,其实也是对的,因为最后这个list会析构,我说的内存泄漏指的是临时变量销毁的那一瞬间)

所以正因为是传值返回,不管你在不在这个函数的前面加const,只要是你引用,你就得加const,因为它产生的临时变量是常性,但是我个人认为是直接不要引用传值返回的函数,以为在把这个返回值返回给你的时候,这里是会出问题的,因为list是刚好不需要在迭代器类中析构,所以可以正确,如果是其他的地方呢?是不是就出错了。

然后返回主题,const到底加不加,加了的话,代表传值返回的是一个常量,然后会产生一个临时变量,临时变量具有常性,不加的返回的是一个变量,但是产生的临时变量依然具有常性,所以,我认为这里是加不加都可以,不影响。

那么,对此,大家的意见是什么呢?希望大佬可以在说出自己的意见(如果本文有错误,希望大家指出,因为是自己所想)。 

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

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

相关文章

MFC第十六天 CFileDialog、CEdit简介、(线程)进程的启动,以及Notepad的开发(托盘技术-->菜单功能)

文章目录 CCommonDialogCFileDialogCEdit托盘技术进程的启动附录1:启动线程方式附录2:MFC对话框的退出过程 CCommonDialog 通用对话框 CCommonDialog 这些对话框类封装 Windows 公共对话框。 它们提供了易于使用的复杂对话框实现。 CFileDialog 提供用于打开或保存文件的标准对…

使用Git上传大文件模型(超过100MB)教程

目录 modelscope官方教程 服务器拒绝的解决方案 检查.gitattributes文件 modelscope官方教程 我们

Amazon 上的数字孪生:使用 L3 预测性数字孪生来预测“行为”

在上一篇博文中,我们讨论了数字孪生的定义和框架,这与我们的客户在其应用中使用数字孪生的方式一致。我们将数字孪生定义为“单个物理系统的动态数字表示,它通过数据进行动态更新以模仿物理系统的真实结构、状态和行为,从而加快获…

Vue3+ts;枚举(enum);Partial全部可选/Pick选一部分/配置 svg 图标/unplugin-vue-components组件自动按需加载

项目的创建 使用 create-vue 脚手架创建项目。 1.执行创建命令 pnpm create vue # or npm init vuelatest # or yarn create vue2.选择项目依赖内容。 ✔ Project name: … //项目名 ✔ Add TypeScript? … No / Yes ✔ Add JSX Support? … No / Yes ✔ Add Vue Router …

macOS 开发 - 纯代码生成 Window

文章目录 1、创建项目删除项目自带 window创建 BaseWindowController 继承自 NSWindowController子 WC 继承 BaseWC个人更喜欢纯代码:控制力、方便复制,不用卡卡的打开 xib 这里不使用各种项目自带的 storyboard/xib,使用纯代码创建 window(controller) 本示例代码将创建如下…

记录一下Mybatis中的if标签使用时遇到的问题

记录一下Mybatis中的if标签使用时遇到的问题 前言一、if标签遇到的问题二、if标签中""和的问题字符串等于条件的两种写法&#xff1a; 三 、总结 前言 今天在项目中进行查询时使用了if标签&#xff0c;遇到了问题&#xff1a; 开始时拉过代码来的时候是这样的 <…

Java关键字interface(接口)

文章目录 接口的理解接口的声明接口的成员说明接口的使用规则类实现接口&#xff08;implements&#xff09; 接口的多实现接口的多继承(extends)接口与实现类对象构成多态引用使用接口的静态成员使用接口的非静态方法JDK8中相关冲突问题总结小测试接口与抽象类之间的对比练习 …

不允许你不知道的 MySQL 优化实战(二)

文章目录 11、使用联合索引时&#xff0c;注意索引列的顺序&#xff0c;一般遵循最左匹配原则。12、对查询进行优化&#xff0c;应考虑在where及order by涉及的列上建立索引&#xff0c;尽量避免全表扫描。13、如果插入数据过多&#xff0c;考虑批量插入。14、在适当的时候&…

[QT编程系列-9]:C++图形用户界面编程,QT框架快速入门培训 - 3- QT窗体设计 - 自动布局

目录 3. QT窗体设计 3.7 自动布局 3.7.1 自动布局 3.7.2 在主窗口中自动布局 3.7.3 在自动布局容器中自动布局 3.7.4 在widget中自动布局 3.7.5 自动布局工件 3. QT窗体设计 3.7 自动布局 3.7.1 自动布局 在QT中&#xff0c;自动布局是一种灵活而强大的方式来管理和排…

【ArcGIS Pro二次开发】(47):要素类追加至空库(批量)

本工具主要是针对国空数据入库而做的。 如果你手头已经整理了一部分要素类数据&#xff0c;但是数据格式&#xff0c;字段值可能并没有完全按照规范设置好&#xff0c;需要将这些数据按规范批量和库&#xff0c;就可以尝试用这个工具。 准备数据&#xff1a;标准空库、你已做…

Vue源码分析拓展 - Vue 模板编译渲染函数原理分析

目录 Vue 模板编译渲染函数 编译 Vue 模板编译渲染函数原理分析.html compiletoFunctions.html compileToFunctions.js vue.2.5.1.源码学习.js 一张AI生成图~ Vue 模板编译渲染函数 new Vue():初始化 $mount:挂载 compile():编译 parse:解析 optimize&#xff1a;静态节…

身份证读卡器安卓SDK在安卓12版本targetSdkVersion=32报错解决办法

之前的东信智能的EST-100身份证读卡器安卓SDK版本V1.0.40在安卓12版本&#xff0c;targetSdkVersion32的时候会出现以下错误&#xff1a; Targeting S (version 31 and above) requires that one of FLAG_IMMUTABLE or FLAG_MUTABLE be specified when creating a PendingInten…

Nginx 解决漏洞扫描 弱CORS策略

主要在nginx配置允许通过的地址 如&#xff1a; if ($http_host !~* 192.168.0.1|127.0.0.1|localhost) { # 允许的ipreturn 403 ; }add_header Access-Control-Allow-Origin $http_origin; #跨域请求

高压放大器到底有什么作用

高压放大器是一种重要的电子元器件&#xff0c;其作用是将信号放大到更高的电压水平&#xff0c;以便供给需要高电压的负载使用。高压放大器被广泛应用于通讯设备、医疗仪器、仿真模拟、气体激光、光学器件等领域。下面安泰电子将详细介绍高压放大器的作用以及其在各领域中的应…

Win11 设置FTP服务详细教程

起因&#xff1a; 因测试需要&#xff0c;本机建立FTP服务测试使用&#xff0c;此文章用于记录使用&#xff01; 操作步骤&#xff1a; 1、配置FTP功能 ①、"winR" > 在运行窗口输入"control" 回车&#xff1b; ②、打开"控制面板" > 点击…

图文讲解Redis延时双删原因及必要性

目录 一、前言 二、常见更新策略 2.1 先删缓存&#xff0c;再更新数据库 2.2 先更新数据库&#xff0c;再删除缓存 2.3 普通双删 2.4 延迟双删 三、建议 一、前言 我们在实际项目中经常会使用到Redis缓存用来缓解数据库压力&#xff0c;但是当更新数据库时&#xff0c;…

今天实习第三天,vue(cli部分)

01.创建第一个vue-cli。这里用的是node.js。早上的时候&#xff0c;就需要把node.js安装上去 02.node.js安装 第一步.去官网下载node.js https://nodejs.org/en 第二步.运行官网下载的node.js的msi文件&#xff08;记住所有的node.js文件的安装包都是msi文件的形式&#xff0…

算法笔记\python 笔记: 相似性度量

1 欧氏距离 1.1 python实现&#xff1a; from scipy.spatial import distance distance.euclidean([1,2],[2,1]) #1.4142135623730951 1.2 标准化欧氏距离 先将数据标准化 &#xff08;减去的均值两两抵消&#xff09; 2 曼哈顿距离 又称为城市街区距离 2.1 python 实现 f…

C++图形开发(16):绘制一个圆环和一根针

文章目录 绘制一个圆环和一根针1.1 绘制1.2 line()函数1.3 circle()函数1.4 setlinestyle()函数1.5 setlinecolor()函数 接下来&#xff0c;我会继续制作一些小游戏&#xff0c;但因为整个难度的上升&#xff08;毕竟我也是初学者&#xff09;&#xff0c;可能文章不会再像之前…

吐血整理,性能测试-Jmeter分布式压测实战(超细详解)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 Jmeter的集群模式…