Day 10 C++ 引用

news/2024/4/26 14:16:14/文章来源:https://blog.csdn.net/m0_74921567/article/details/131952427

目录

什么是引用

 

语法

引用和指针区别

引用注意事项

 常量引用

 语法

 注意

引用的本质

引用的使用

引用做函数参数

引用做函数返回值


什么是引用

C++中的引用是一种别名,它允许我们使用不同的名称来引用同一变量。通过引用,我们可以通过一个变量名称来操作另一个变量的值,而无需使用指针。在C++中,引用使用&符号进行声明。

 

语法

type &ref_name = variable;

type是引用对象的类型,ref_name是引用的名称,variable是被引用的变量。

 

引用和指针区别

引用和指针都提供了间接访问变量的方法,但它们有一些重要区别:

  • 引用必须在声明时进行初始化,而指针可以在任何时候进行赋值和修改。

  • 引用不需要解引用操作符 *,而指针需要通过 * 对指针进行解引用操作

  • 引用不能为 空引用,而指针可以为 空指针(指向NULL)。

引用注意事项

  • 引用必须在声明时进行初始化,引用在初始化后,将一直引用相同的变量,就不能再引用其他变量。

  • 可以有多个引用, 而且多个引用可以引用同一个变量,但是一个引用只对应一个变量

  • 引用使用 & 符号进行声明,并与类型相结合。

  • 引用充当了变量的别名,对引用的操作实际上是对原始变量的操作

  • 引用不能引用临时变量或常量,只能引用可修改的变量。(临时变量是指无法取址的临时值,例如直接使用字面值或通过表达式生成的临时结果。在C++中,引用必须引用一个具名的、可寻址的对象或变量,因此临时变量不能被引用。)

 

 常量引用

常量引用在C++中是指对不可修改的对象进行引用的一种方式。通过使用常量引用,我们可以以只读的方式访问对象,而不允许对其进行修改。

 语法

const type &ref_name = variable;

 注意

  1. 常量引用可以绑定到非常量对象或常量对象上,但不能绑定到临时对象(例如,函数返回的临时对象)上。

  2. 通过常量引用无法修改原始对象的值。

  3. 使用常量引用可以避免不必要的拷贝,特别是当对象很大时,可以提高程序的效率。

  4. 常量引用可以作为函数参数传递,确保函数内部无法修改传递的对象。

引用的本质

在C++内部实现中,引用的本质可以看作是一个指针常量。尽管引用和指针有一些相似之处,但它们也有一些重要的区别。C++推荐用引用技术,因为语法方便,引用本质是指针常量,但是所有的指针操作编译器都帮我们做了 在编译器的角度来看,引用实际上是在指针的基础上进行了一些额外的处理和语法糖。编译器将引用作为指向所引用对象的指针,但对开发者而言,使用引用更加方便和直观。

引用的使用

引用做函数参数

 引用在函数参数传递中非常有用,可以简化指针修改实参,它可以通过引用对函数外部的变量进行修改,同时避免了对象的复制,引用作为参数传递时,不需要使用指针的解引用操作符 *,并且可以直接操作原始变量。在函数参数传递中,将参数声明为引用类型,可以实现对原始变量的直接操作。

void increment(int& value) {value++;
}int main() {int num = 10;increment(num);// num 的值现在为 11return 0;
}

需要注意的是,如果在函数中不需要修改原始变量的值,可以将参数声明为常量引用(const reference)。这样做可以提高代码的可读性,并确保在函数内部不意外地修改了参数的值。

引用做函数返回值

引用作为函数的返回值,可以方便地将函数内部的结果传递给调用者,并且避免了对象的复制。通过返回引用,可以直接访问和修改原始对象。

注意不要返回局部变量引用

在函数中返回引用时要特别小心,确保引用的对象在函数结束后仍然有效。

int& getLargest(int& a, int& b) {return (a > b) ? a : b;
}int main() {int num1 = 10;int num2 = 20;int& largest = getLargest(num1, num2);largest = 30;// num2 的值现在为 30return 0;
}

在上面的示例中,函数 getLargest 接受两个整数引用作为参数,并返回其中较大的那个引用。在主函数中,我们将返回值引用赋给 largest 变量,并可以通过它直接修改原始对象 num1num2。再次强调,返回引用时必须确保返回的引用仍然有效。这意味着被返回的引用必须指向某个在函数结束后仍然存在的对象。一般而言,需要避免返回指向局部变量的引用,因为局部变量在函数结束后会被销毁。

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

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

相关文章

kali Linux 工具 BurpSuite-暴力破解

关于渗透的实验,我们大多数能在kali的工具集找到,其中关于抓包工具BurpSuite的使用,我做一个比较简单的实验————————暴力破解—————————— 暴力破解,顾名思义,就是我们把密码一个个尝试,只…

【MySQL】索引特性

​🌠 作者:阿亮joy. 🎆专栏:《零基础入门MySQL》 🎇 座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根 目录 👉没…

ReID网络:MGN网络(1) - 概述

Start MGN 1. 序言 现代基于感知的信息中,视觉信息占了80~85%。基于视觉信息的处理和分析被应用到诸如安防、电力、汽车等领域。 以安防市场为例,早在2017年,行业咨询公司IHS Market,我国在公共和私人领域安装有摄像头约1.76亿…

docker启动容器报错

报错信息 [rootDream soft]# docker run -it -d -p 8080:8080 tomcat eec9fab6b9ca06d2bbf1467aef05d8020ee60448978e10ac20c38888934f0a0b docker: Error response from daemon: driver failed programming external connectivity on endpoint hungry_euclid (163242f0079e72…

数值分析第五章节 用Python实现解线性方程组的直接解法

参考书籍:数值分析 第五版 李庆杨 王能超 易大义编 第5章 解线性方程组的直接解法 文章声明:如有发现错误,欢迎批评指正 文章目录 引言与预备知识高斯消去法列主元消去法 矩阵三角分解法杜利特尔分解法平方根法 向量和矩阵的范数误差分析 引言…

Python 进阶(五):os 模块

❤️ 博客主页:水滴技术 🌸 订阅专栏:Python 入门核心技术 🚀 支持水滴:点赞👍 收藏⭐ 留言💬 文章目录 1. 文件和目录的基本操作1.1 获取当前工作目录1.2 更改当前工作目录1.3 获取目录下所有…

qssh使用

到官网下载qssh的源码QSsh-botan-1,使用qtcreator打开后,直接编译,即可得到qssh的库 头文件将QSsh-botan-1\src\libs\ssh目录下的.h文件拷到include文件夹下,即为库头文件。 qssh有个问题,如果你将qssh的类放在子线程…

致敬图灵!HashData拥抱数据智能新时代!

图1:2023ACM中国图灵大会现场 生于1912年的艾伦图灵被称为“计算机科学之父”、“人工智能之父”。1966年,国际计算机协会(ACM)为了纪念这位卓越的科学家,设立了以其名字命名的ACM图灵奖,以表彰在计算机领…

MySQL | 常用命令示例

MySQL | 常用命令示例 一、启停MySQL数据库服务二、连接MySQL数据库三、创建和管理数据库四、创建和管理数据表五、数据备份和恢复六、查询与优化 MySQL是一款常用的关系型数据库管理系统,广泛应用于各个领域。在使用MySQL时,我们经常需要编写一些常用脚…

【初阶C语言】整数比大小

各位大佬的光临已是上上签 在C语言刷题过程中,一定遇到过很多比大小的题目,那么本节就专门介绍比大小的方法,若大佬们还有更优解,欢迎补充呀! 本节讲解的方法主要有三种:1.条件判断 2.三目操作符 3.函数调…

干翻Dubbo系列第四篇:Dubbo3第一个应用程序细节补充

前言 不从恶人的计谋,不站罪人的道路,不坐亵慢人的座位,惟喜爱耶和华的律法,昼夜思想,这人便为有福!他要像一棵树栽在溪水旁,按时候结果子,叶子也不枯干。凡他所做的尽都顺利。 如…

14 Linux实操篇-进程管理(重点)

14 Linux实操篇-进程管理(重点) 文章目录 14 Linux实操篇-进程管理(重点)14.1 进程的基本操作14.1.1 进程和程序14.1.2 父进程和子进程14.1.3 常见的Linux进程14.1.4 显示系统执行的进程-ps14.1.5 终止进程-kill/killall14.1.6 查…

36.悬浮板

悬浮板 html部分 <div class"container"><div class"square"></div> </div>css部分 *{margin: 0;padding: 0; } body{background-color: #111;height: 100vh;overflow: hidden;display: flex;justify-content: center;align-it…

【小白必看】Python爬虫实战之批量下载女神图片并保存到本地

文章目录 前言运行结果部分图片1. 引入所需库2. 发送请求获取网页内容3. 解析网页内容并提取图片地址和名称4. 下载并保存图片完整代码关键代码讲解 结束语 前言 爬取网络上的图片是一种常见的需求&#xff0c;它可以帮助我们批量下载大量图片并进行后续处理。本文将介绍如何使…

机器学习 | Python实现NARX模型预测控制

机器学习 | Python实现NARX模型预测控制 目录 机器学习 | Python实现NARX模型预测控制效果一览基本介绍研究内容程序设计参考资料效果一览 基本介绍 机器学习 | Python实现NARX模型预测控制 研究内容 贝叶斯黑盒模型预测控制,基于具有外源输入的非线性自回归模型的预期自由能最…

绝美!轮到AI写真爆火了!18种AI视频制作教程;Llama 2微调的极速指南;Nijijourney官方AI绘画课 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f916; 摄影写真面临AI技术洗牌&#xff0c;一键生成杂志大片的时代来了 软件&#xff1a;midjourney & Stable Diffusion 模型&#xff…

TypeScript基础篇 - TS模块

目录 模块的概念 Export 语法&#xff08;default&#xff09; Export 语法&#xff08;non-default&#xff09; import 别名 Type Export语法【TS】 模块相关配置项&#xff1a;module【tsconfig.json】 模块相关配置项&#xff1a;moduleResolution 小节总结 模块的…

【LLM】大语言模型学习之LLAMA 2:Open Foundation and Fine-Tuned Chat Model

大语言模型学习之LLAMA 2:Open Foundation and Fine-Tuned Chat Model 快速了解预训练预训练模型评估微调有监督微调(SFT)人类反馈的强化学习(RLHF)RLHF结果局限性安全性预训练的安全性安全微调上手就干使用登记代码下载获取模型转换模型搭建Text-Generation-WebUI分发模型…

pytorch的发展历史,与其他框架的联系

我一直是这样以为的&#xff1a;pytorch的底层实现是c(这一点没有问题&#xff0c;见下边的pytorch结构图),然后这个部分顺理成章的被命名为torch,并提供c接口,我们在python中常用的是带有python接口的&#xff0c;所以被称为pytorch。昨天无意中看到Torch是由lua语言写的&…

M 芯片的 macos 系统安装虚拟机 centos7 网络配置

centos 安装之前把网络配置配好或者是把网线插好 第一步找到这个 第二步打开网络适配器 选择图中所指位置 设置好之后 开机启动 centos 第三步 开机以后 编写网卡文件保存 重启网卡就可以了&#xff0c;如果重启网卡不管用&#xff0c;则重启虚拟机即可 “ ifcfg-ens160 ” 这…