c++-引用
一、引用的基本概念
引用是C++中一种特殊的变量别名机制,本质上是指针常量(编译器自动解引用),但语法更简洁安全。
核心特性:
-
必须初始化:引用在定义时必须绑定到一个已存在的对象。
-
类型严格匹配:引用的类型必须与绑定的对象类型一致。
-
绑定后不可重新指向:引用一旦绑定到某个对象,就不能再绑定到其他对象。
-
操作等同于原变量:对引用的操作直接作用于原变量。
优点:
-
避免空指针问题:引用必须绑定到有效对象,不会出现空指针。
-
语法简洁:无需显式使用
*或&操作符。 -
支持运算符重载:如
<<、>>等。
二、引用的定义与常见错误
基础语法:
int data = 100;
int& ref = data; // ref是data的别名
ref = 200; // data的值变为200
典型错误示例:
-
类型不匹配:
double a = 10.3; int& b = a; // 错误!double与int类型不一致 -
未初始化:
int& c; // 错误!引用必须初始化
三、引用的本质
引用在底层通过指针实现,但编译器隐藏了指针的语法细节:
int data = 10;
int& ref = data; // 等效于 int* const ref = &data;
*ref = 20; // 等效于 *ref = 20;
四、对指针和数组的引用
引用指针:
int data = 10;
int* ptr = &data;
int*& ref_ptr = ptr; // ref_ptr是ptr的别名
引用数组:
int arr[3] = {1, 2, 3};
int (&ref_arr)[3] = arr; // 必须指定数组大小
cout << sizeof(ref_arr); // 输出12(int[3]的大小)
五、引用在函数中的应用
作为函数参数:
void swap(int& a, int& b) {int tmp = a;a = b;b = tmp;
}
-
对比指针:引用无需检查空指针,语法更简洁。
作为返回值:
错误示例:
string& func() {string str = "Hello";return str; // 返回局部变量的引用,导致悬垂引用!
}
解决方案:
-
返回静态变量或动态分配内存。
-
使用移动语义(C++11右值引用)。
六、常引用(const引用)
基本规则:
const int& cref = 10; // 合法!常引用可绑定字面量
int num = 100;
const int& cref2 = num; // 不可通过cref2修改num
特性:
-
绑定常量、字面量或临时变量:常引用可以绑定到临时变量,延长其生命周期。
-
不可修改:通过常引用无法修改绑定的变量。
七、引用与指针的对比
| 特性 | 引用 | 指针 |
|---|---|---|
| 初始化要求 | 必须初始化 | 可为空(nullptr) |
| 重新绑定 | 不可 | 可 |
| 内存占用 | 无独立存储(别名) | 占用4/8字节(地址存储) |
| 多级间接访问 | 仅一级 | 支持多级(如int**) |
| 空值风险 | 无 | 有 |
八、const修饰符的对比
指针与const:
int x = 3;
const int* p1 = &x; // 指向常量的指针(值不可改)
int* const p2 = &x; // 常量指针(地址不可改)
const int* const p3 = &x; // 双重const
引用与const:
const int& r = x; // 不可通过r修改x
x = 10; // 合法!原变量仍可修改
九、代码判断题解析
题目1:
int x=3, y=4;
int* const p = &x;
p = &y; // 错误!p是常量指针,不可修改指向
题目2:
const int x = 3;
const int& y = x;
y = 10; // 错误!y是常引用,不可修改值
十、扩展应用
范围for循环:
int arr[] = {1, 2, 3};
for (int& elem : arr) {elem *= 2; // 直接修改原数组元素
}
右值引用(C++11):
std::string&& rref = std::move(str); // 移动语义,避免拷贝
十一、最佳实践
-
优先使用引用:函数参数传递时,若不需要重新绑定,优先用引用替代指针。
-
避免返回局部引用:防止悬垂引用。
-
常引用优化性能:函数参数为只读时使用
const T&,避免拷贝。
总结
引用是C++中一种强大的机制,能够简化代码、提高安全性,并在性能优化中发挥重要作用。理解引用的本质和应用场景,能够帮助您写出更高效、更安全的代码。
相关文章:
c++-引用
一、引用的基本概念 引用是C中一种特殊的变量别名机制,本质上是指针常量(编译器自动解引用),但语法更简洁安全。 核心特性: 必须初始化:引用在定义时必须绑定到一个已存在的对象。 类型严格匹配…...
SpringCould微服务架构之Docker(6)
容器的基本命令: 1. docker exec :进入容器执行命令 2. docker logs: -f 持续查看容器的运行日志 3. docker ps:查看所有运行的容器和状态 案例:创建运行一个容Nginx容器 docker run--name myNginx -p 80:80 -d nginx 命…...
Linux|gitlab|二进制快速安装部署gitlab-ce教程
一、 gitlab二进制文件下载地址: 官方网站: gitlab/gitlab-ce - Packages packages.gitlab.com 清华镜像站: Index of /gitlab-ce/yum/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror gitlab分为ce也就是社区版本和ee版本,…...
java网盘项目,文件和文件夹用两个表还是一个表,两个表理论查询效率慢了为啥要用,有啥优势
java网盘项目,文件和文件夹用两个表还是一个表,两个表理论查询效率慢了为啥要用,有啥优势 根据网盘系统设计经验与数据库优化原则,独立文件夹表和文件表的设计在复杂场景下具有显著优势。以下是分表方案的核心价值与效率优化策略…...
NixVis 开源轻量级 Nginx 日志分析工具
NixVis NixVis 是一款基于 Go 语言开发的、开源轻量级 Nginx 日志分析工具,专为自部署场景设计。它提供直观的数据可视化和全面的统计分析功能,帮助您实时监控网站流量、访问来源和地理分布等关键指标,无需复杂配置即可快速部署使用。 演示…...
vscode正则表达式使用
小标题 ^\d.\d.\d\s.*$ ^表示匹配字符串的开头。\d\.\d\.\d表示匹配一到多个数字,接着一个小数点,再接着一到多个数字,然后又一个小数点和一到多个数字,用来匹配类似 “2.1.1” 这样的标题号部分。\s表示匹配一个空格。.*表示匹配…...
OpenAI API - Realtime 实时
文章目录 实时 API(Beta)使用实时API入门示例应用合作伙伴集成 用例通过 WebRTC 连接概述连接详情创建一个临时token发送和接收事件 使用 WebSockets 连接概述连接详情 实时对话Beta实时语音到语音会话会话生命周期事件文本输入和输出音频输入和输出语音…...
PE文件(十三)资源表
所谓的资源也就是我们之前学的MFC中的对话框,按钮,编辑框之类的东西。不仅MFC有资源,我们平时熟悉的控制台程序也有资源 当我们平时写一些程序或者木马时,我们通常对其定义一个随机的名称或者路径,然后再向外界进行释…...
丝杆升降机行程控制:精准运行的奥秘
丝杆升降机作为机械传动领域的 “得力干将”,在环保设备、工业生产线、建筑施工等众多场景中发挥着关键作用。其能够实现重物的升降、平移等操作,而行程控制对于丝杆升降机而言,就如同给机器设定了行动边界,不仅关乎设备能否精准达…...
为什么使用Flask + uWSGI + Nginx 部署服务?
概述 在Python开发的web应用中,我们通常能够看到flask、uWSGI、Nginx出现在一起,他们之间的关系是什么?为什么总是被应用在一起?  三者共同使用为了实现一个目的:客户端向服务端发送数据请求,服…...
力扣.旋转矩阵Ⅱ
59. 螺旋矩阵 II - 力扣(LeetCode) 代码区: class Solution {const int MAX25; public:vector<vector<int>> generateMatrix(int n) {vector<vector<int>> ans;vector<int> hang;int len_nn;int arry[25][25]…...
HFSS 使用入门
资源 下载资源: https://download.csdn.net/download/wangjun_huster/90547193 下载破解: https://download.csdn.net/download/wangjun_huster/90547551 安装 https://www.bilibili.com/list/ml3403866295?oid925751664&bvidBV1CT4y1u7LB 入门…...
对内核fork进程中写时复制的理解记录
前言 文章写于学习Redis时对aof后台重写中写时复制的疑问 一、感到不理解的歧义 在部分技术文档中(以小林的文章为例),对写时复制后的内存权限存在如歧义: ! 二、正确技术表述 根据Linux内核实现(5.15版本&#x…...
ubuntu 升级补丁,备份备份备份
一、常规软件包更新(安全补丁和软件升级) 更新软件包列表 从软件源服务器获取最新的软件包信息: sudo apt update升级已安装的软件包 安装所有可用的更新(安全补丁、功能更新): sudo apt upgrade处理依赖…...
HarmonyOS-ArkUI Navigation (导航组件)-第一部分
导航组件主要实现页面间以及组件内部的界面跳转,支持在不同的组件间进行参数的传递,提供灵活的跳转栈操作,从而便捷的实现对不同页面的访问和复用。 我们之前学习过Tabs组件,这个组件里面也有支持跳转的方式,Navigati…...
【磁盘扩容】linux磁盘扩容
一、新磁盘分区 1、新磁盘在接入服务器后,很好辨认 使用fdisk -l命令,查看: 或者使用 lsblk -f 其中sdb,sdc, sda都是挂载硬盘,sr0为DVD光盘,很明显sdc没有进行任何的挂载,确定sdc为新磁盘 2、格式化新…...
字典翻转教学
第1关:创建大学英语四级单词字典 任务描述 本关任务:编写一个能创建大学英语四级单词字典的小程序。 相关知识 为了完成本关任务,你需要掌握: 1.创建空字典 2.字典中增加元素 3.字典视图 4.字典排序 创建空字典 空的大括号{}和…...
详解CountDownLatch底层源码
大家好,我是此林。 今天来分享一下CountDownLatch的底层源码。 CountDownLatch 是 Java 并发包 (java.util.concurrent) 中的线程之间同步工具类,主要用于协调多个线程的执行顺序。其核心思想是通过计数器实现线程间的"等待-唤醒"机制&#…...
Gitee批量删除仓库
Gitee批量删除仓库 文章目录 Gitee批量删除仓库生成一个GiteeToken通过Python调用Gitee API参考文档 生成一个GiteeToken 右上角下拉->设置->安全设置->私人令牌->生成新令牌,注意将令牌保存(只会出现一次) 通过Python调用Gite…...
AI 时代,我们该如何写作?
当ChatGPT/DeepSeek能在几秒钟内产出一篇文章,而且生成能力日益精进,你是否也曾思考,我还能做什么? 当2024年AI开始进入人们的视野,我在CSDN 上的博客也悄然发生了变化,以前一篇文章发布后,阅读…...
day16 学习笔记
文章目录 前言一、广播机制二、数组遍历1.for循环2.nditer函数 三、数组操作1.reshape函数2.flat属性3.flatten函数4.revel函数5.数组转置6.升维与降维7.数组的连接与分割8.数组运算 前言 通过今天的学习,我进一步掌握了更多numpy的语法知识 一、广播机制 广播&am…...
Python基于EdgeTTS库文本转语音
EdgeTTS,支持粤语等各种方言,无需部署无需Key,完全免费,太香了 因为其底层是使用微软 Edge 的在线语音合成服务,所以不需要下载任何模型,甚至连 api_key 都给你省了,简直不要太良心~ 关键是&a…...
Day43 | 129. 求根节点到叶节点数字之和、1382. 将二叉搜索树变平衡、100. 相同的树
129. 求根节点到叶节点数字之和 题目链接:129. 求根节点到叶节点数字之和 - 力扣(LeetCode) 题目难度:中等 代码: class Solution {List<Integer> pathnew ArrayList<>();int res0;public int sumNumb…...
MFC案例:利用计时器(Timer)动态绘制正弦曲线
这是一个基于对话框的MFC程序,运行效果是在只画出I、IV象限的坐标系中绘制出红、蓝、绿各相差PI/2的三条正弦曲线,计时器运行一个周期曲线在X轴移动一个像素(对应1度),Y轴显示正弦值(150个像素代表1&#x…...
解析 HTML 网站架构规范
2025/3/28 向全栈工程师迈进! 一、网页基本的组成部分 网页的外观多种多样,但是除了全屏视频或游戏,或艺术作品页面,或只是结构不当的页面以外,都倾向于使用类似的标准组件。 1.1页眉 通常横跨于整个页面顶部有一…...
Kubernetes》》K8S》》Deployment 、Pod、Rs 、部署 nginx
Deployment deployment文档说明 kubectl get rs,deployment,pods 删除pod 、deployment 、service # 如果只删除pod,deployment会自动重建,所以应该先删除deployment。 # 下面演示的是删除所有deployment,可以指定只删除某个 # 删除所有…...
链表(C++)
这是本人第二次学习链表,第一次学习链表是在大一上的C语言课上,首次接触,感到有些难;第二次是在大一下学习数据结构时(就是这次),使用C再次理解链表。同时,这也是开启数据结构学习写…...
nginx 设置隐藏版本号
Nginx默认会在Server头里包含版本信息,比如“nginx/1.18.0”,这可能存在安全隐患,因为攻击者知道了版本号后,可以针对特定版本的漏洞进行攻击。所以,隐藏版本号是一个常见的安全措施。 可通过在http块里加上server_to…...
29_项目
目录 http.js 1、先注册账号 register.html 2、再登录 login.html 3、首页 index.html 4 详情 details.html cart.html css index.css register.css details.css 演示 进阶 http.js let baseURL "http://localhost:8888"; let resgiterApi baseURL &…...
排序算法1--插入排序
目录 1.常见排序算法 2.排序算法的预定函数 2.1交换函数 2.2测试算法运行时间的函数 3.插入排序 3.1直接插入排序 3.2希尔排序 3.3插入排序的时间复杂度分析 4.总结 1.常见排序算法 我将分别讲解五种排序算法,但是不代表只有五种固定的代码,之后…...
