【c++基础知识——引用的深度理解】

C++ 引用 深度理解

  1. 对于一个函数来说,传值和传引用,在函数功能上没有区别,但在性能和副作用方面有显著差异。

    • 传值
      当按值传递参数时,函数会创建参数的一个副本。这样做的好处是函数内部对参数的修改不会影响原始变量,但缺点是对于大对象来说,拷贝操作会带来性能开销。

    • 传引用
      当按引用传递参数时,函数接收的是参数的引用,而不是副本。这样做的好处是避免了拷贝操作,提高了性能,但函数内部对参数的修改会影响原始变量。

    除此之外,当函数的形参是一个const修饰的引用的时候,意思是在该函数内,不会通过这个引用修改值。所以实参是不是const修饰的引用,是不是const修饰的变量,都没有关系。只是说明该函数内部不会通过引用修改值。而且外面如果不是常量,函数外面可以随意修改值的。

    说白了,就是形参的const 引用,只能保证在这个函数里,不会改变这个引用的值,至于外面传入的实参是值还是引用,改不改值,我不管。

#include <iostream>
using namespace std;
void func(const int& a)//这个const 引用的意思是,只能保证在这个函数里,不会改变这个引用的值,至于外面是值还是引用,改不改,我不管。
{std::cout << "test = " << a << std::endl;return;
}void func2(int& a)//这个引用的意思是,在这个函数里,可以改变这个引用的值,至于外面是值还是引用,改不改,我不管。
{std::cout << "test = " << a << std::endl;return;
}
int main()
{const int a = 0;//定义了一个常量,本身值不可修改//a++;// 这行代码是不合理的,因为 a 是一个常量,不能修改其值func(a)//可以作为实参func2(a); // 不合理,因为func2()的形参是非const类型,预示着可以在函数里改变值,你将一个不能改变值的变量传递给它是不可以的。int b = 0;// 定义了一个变量func(b); //可以作为实参b++; // 外面修改不影响,作为实参传入const引用int& c = b;//定义c位非常量引用,引用的值就是变量bfunc(c);//非const引用,可以作为实参传给const 引用形参,说明函数体内不改值c++;const int& d = c;// d 是 c 的常量引用,不能通过d去修改c的值,但是通过c可以修改引用的值func(d);c++;//这是合理的,因为c是非常量引用可以修改值// d++;// 不合理,因为 d 是一个常量引用,不能修改其值,d是常量引用,c是非常量引用,二者的值都是变量breturn 0;
}
  1. 多个引用所绑定的值是同一个地址的内容的时候,不能通过常量引用修改,但是可以通过非常量引用修改值。如果非常量引用修改了值,那么相应的常量引用对应的值,也发生了改变。因为二者所对应的变量是同一个地址里的内容。由此我们可以得知,常量引用的意思是,不要希望通过我去改变所引用变量的值,但是至于其他引用有没有改变所引用的值,我就管不了了。我只能保证我不会改而已。

例如:

int a = 1;const auto& b = a;auto& c = a;c++;//可以通过c改变,所引用的值,与此同时,常量引用b所引用的值也被改变了。因为二者所引用的值是同一个地址。
  1. 被const修饰的变量,是无法修改值的,谁都不可以修改,除了非常规手段,但是及其不推荐。所以即使重新定义引用绑定到这个变量上,也不可能修改,所以只能是常量引用可以绑定这个变量上。意味着不可试图修改引用值。
#include <iostream>
using namespace std;int main()
{const int a = 0;// 定义了一个常量,意思是不可更改,重新定义的引用绑定到该变量也不能修改,而且只能常量引用可以绑定int& b = a;// 不合理,非常量引用不能绑定到常量,编译报错int b = a;//合理,重新定义了一个变量b,是a的一个拷贝,但是是非常量。b值得改变丝毫不影响a得值int& c = b; //合理,定义了一个非常量引用c,绑定到b上,因为b是非常量,可以绑定,且可以通过c修改。const int& d = c; //合理,定义了一个常量引用d,绑定到非常量引用c所绑定的变量上b上,所以和c绑定的是同一个变量,但是不要企图通过d去改变引用的值,至于c去不去改,变量b自己去不去改,其他可能的引用去不去修改,我d管不到。我只保证我自己无法修改。return 0;
}

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

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

相关文章

修改Docker默认存储路径,解决系统盘占用90%+问题(修改docker root dir)

随着Docker技术的广泛应用&#xff0c;它极大地简化了复杂项目的部署与维护流程&#xff0c;仅凭单一镜像即可轻松运行。然而&#xff0c;随着数据量不断增长&#xff0c;Docker的默认数据存储方式可能逐渐成为挑战&#xff0c;尤其是当默认安装于根目录&#xff08;“/”&…

【雪球-注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 1. 暴力破解密码&#xff0c;造成用户信息泄露 2. 短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉 3. 带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造…

Python酷库之旅-第三方库Pandas(104)

目录 一、用法精讲 451、pandas.DataFrame.pow方法 451-1、语法 451-2、参数 451-3、功能 451-4、返回值 451-5、说明 451-6、用法 451-6-1、数据准备 451-6-2、代码示例 451-6-3、结果输出 452、pandas.DataFrame.dot方法 452-1、语法 452-2、参数 452-3、功能…

【C++】STL简介

&#x1f525;个人主页&#xff1a; Forcible Bug Maker &#x1f525;专栏&#xff1a;STL || C 目录 前言什么是STL&#xff1f;STL的历史STL的版本STL六大组件STL的优缺点STL的优点&#xff1a;STL的缺点&#xff1a; 如何学习STL结语 前言 本篇博客主要内容&#xff1a;ST…

灾备技术演进之路 | 虚拟化无代理备份只能挂载验证和容灾吗?只能无代理恢复吗?且看科力锐升级方案

灾备技术演进之路系列 虚拟化备份技术演进 摆脱束缚&#xff0c;加速前行 无代理备份仅能挂载/恢复验证吗&#xff1f; ——科力锐极简验证演练无代理备份来了 无代理备份无法应对平台级故障吗&#xff1f; ——科力锐应急接管无代理备份来了 无代理备份仅能同平台挂载吗&a…

Llama 3.1 Omni:颠覆性的文本与语音双输出模型

你可能听说过不少关于语言模型的进展,但如果告诉你,有一种模型不仅能生成文本,还能同时生成语音,你会不会觉得特别酷?今天咱们就来聊聊一个相当前沿的项目——Llama 3.1 Omni模型。这个模型打破了传统的文字生成边界,直接让文本和语音同时输出,实现了真正的"多模态…

无人机之AI跟踪篇

无人机的AI识别技术依托于计算机视觉和深度学习技术&#xff0c;实现了对目标的快速精准识别&#xff0c;在多个领域展现出了巨大的应用潜力和价值。以下是对无人机AI识别技术的详细解析&#xff1a; 一、无人机AI识别算法的基础原理 无人机AI识别算法主要基于先进的计算机视觉…

轻松解决Jetpack Compose中的一些痛点问题

公众号「稀有猿诉」 原文链接 轻松解决Jetpack Compose中的一些痛点问题 暑去秋来&#xff0c;金桂飘香&#xff0c;不知不觉中我们已经练完了『降Compose十八掌』&#xff0c;相信通过这一系列文章能够对Jetpack Compose有足够的理解&#xff0c;并能在实际项目中进行运…

Linux memcg lru lock提升锁性能

目录 内核关于per memcg lru lock的重要提交&#xff1a; 计算虚拟地址转换基本机制 问题背景 swap换入流程 时奎亮的per memcg lru lock分享视频 内核关于per memcg lru lock的重要提交&#xff1a; f9b1038ebccad354256cf84749cbc321b5347497 6168d0da2b479ce25a4647d…

感知笔记:ROS 视觉- 跟随红球

- 目录 - 如何在 ROS 中可视化 RGB 相机。如何作为机器人切换主题。如何创建 blob 检测器。如何获取要跟踪的颜色的颜色编码。如何使用 blob 检测数据并移动 RGB 相机以跟踪 blob。 机器人技术中最常见的传感器是不起眼的 RGB 摄像头。它用于从基本颜色跟踪&#xff08;blob 跟…

ssm自助购药小程序 LW PPT源码调试讲解

第二章开发技术介绍 此系统的关键技术和架构&#xff0c;Java技术、B/S结构、Ssm框架和Mysql数据库&#xff0c;是本系统的关键开发技术&#xff0c;对系统的整体、数据库、功能模块、系统页面以及系统程序等设计进行了详细的研究与规划。 2.1 系统开发平台 在线自助购药小程…

PMP--二模--解题--1-10

文章目录 4.整合管理--商业文件--商业论证&#xff08;是否值得所需投资、高管们决策的依据&#xff09;反映了&#xff1a;1、 [单选] 收到新项目的客户请求之后&#xff0c;项目经理首先应该做什么&#xff1f; 14.敏捷--角色--产品负责人PO–职责–1.创建待办列表并排序;2.确…

大数据概念与价值

文章目录 引言大数据的概念高德纳咨询公司的定义麦肯锡全球研究所的定义什么是大数据&#xff1f; 大数据的特征Volume&#xff08;体积&#xff09;Variety&#xff08;种类&#xff09;Velocity&#xff08;速度&#xff09;Value&#xff08;价值&#xff09;Veracity&#…

计算机毕业设计Python+Flask微博情感分析 微博舆情预测 微博爬虫 微博大数据 舆情分析系统 大数据毕业设计 NLP文本分类 机器学习 深度学习 AI

首先安装需要的python库&#xff0c; 安装完之后利用navicat导入数据库文件bili100.sql到mysql中&#xff0c; 再在pycharm编译器中连接mysql数据库&#xff0c;并在设置文件中将密码修改成你的数据库密码。最后运行app.py&#xff0c;打开链接&#xff0c;即可运行。 B站爬虫数…

恢复已删除文件的可行方法,如何恢复已删除的文件

在清理 PC 或优化存储设备时无意中删除重要文件是一种常见的人为错误。不可否认&#xff0c;在批量删除文件时&#xff0c;您通常会一起删除垃圾文件和重要文件。您后来意识到一堆文件或文件中缺少一个重要的文档或文件。在这种情况下&#xff0c;您唯一的选择是寻找恢复已删除…

打点-heapdump信息泄露-shiro反序列化获得root权限shell

fscan 扫描结果 heapdump 下载 使用 JDumpSpider-1.1-SNAPSHOT-full.jar 分析&#xff0c;获取 shiro 密钥 验证 爆破利用链 命令执行

【小鹏汽车用户平台-注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 1. 暴力破解密码&#xff0c;造成用户信息泄露 2. 短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉 3. 带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造…

iotop 命令:磁盘IO监控和诊断

一、命令简介 ​iotop​命令用于监视磁盘I/O&#xff0c;实时显示每个进程或线程的读写速率等信息。非常适合用于诊断系统中的I/O瓶颈。 ‍ ​​ ‍ 安装 iotop 在大多数Linux发行版中&#xff0c;iotop​可能不是预装的。可以使用包管理器来安装它。 例如&#xff0c;在…

uniapp出现 下拉框等组件被遮挡 的分析

目录 1. 问题所示2. 代码复现3. 解决方法3.1 下拉框被遮挡3.2 uni-collapse-item 无法下拉的问题 1. 问题所示 下拉框被遮挡的问题&#xff1a; uni-collapse-item组件无法下拉的问题&#xff1a; 2. 代码复现 博主的代码精简如下&#xff1a; <template><view>…

K-means 算法的介绍与应用

目录 引言 K-means 算法的基本原理 表格总结&#xff1a;K-means 算法的主要步骤 K-means 算法的 MATLAB 实现 优化方法与改进 K-means 算法的应用领域 表格总结&#xff1a;K-means 算法的主要应用领域 结论 引言 K-means 算法是一种经典的基于距离的聚类算法&#xff…