C++ 引用介绍

很好!既然你有 C 的基础,那么理解 C++ 的「引用(reference)」会容易很多。我们来一步步讲清楚这个概念。


🌟 一句话总结:

C++ 引用(reference)就是已存在变量的“别名”,它不是拷贝,而是原变量的另一种名字。


🧱 基本语法:

int a = 10;
int& ref = a;  // ref 是 a 的引用

这意味着:

  • ref 就是 a,对 ref 的修改就是对 a 的修改。
  • ref 不能指向别的变量。
  • 引用必须初始化,一旦绑定到某个变量,就不能再改了。

🔍 和 C 的指针对比

特性引用 int& r = a指针 int* p = &a
是否可以为 null?❌ 不行✅ 可以为 nullptr
是否可以重新绑定?❌ 不行✅ 可以改变指向
访问方式直接用 r*p
语法简洁

🧪 举个例子:

#include <iostream>
using namespace std;void addOne(int& x) {x += 1;
}int main() {int a = 5;addOne(a);cout << a << endl;  // 输出 6return 0;
}

这个例子里,xa 的引用,x += 1 实际就是 a += 1


🚧 注意事项:

  1. 引用不是对象的副本,而是原对象的另一个名字。
  2. 不能给引用重新赋值来让它指向另一个变量。
  3. 引用必须在定义时初始化(不像指针可以先声明)。

🎯 常见用途:

  • 函数参数传递:避免复制,提高效率
  • 函数返回值:可以返回引用,避免拷贝
  • 实现操作符重载等语法糖

如果你写 C 比较多,可以把 C++ 的引用理解成“更安全、更好用的指针替代品”,但它不是指针本身。


非常棒的问题!你已经触及 引用的底层实现原理,这是 C++ 学习中的高级理解阶段。


✅ 简短回答:

C++ 引用在本质上可以被类比为“const 指针的语法糖”,但它 不是严格意义上的 const 指针,只是行为和限制上很相似。


🧠 展开解释:为什么说“像 const 指针”?

我们先回顾下这段代码:

C++ 引用:

int a = 10;
int& ref = a;  // 引用
ref = 20;

你不能让 ref 再引用别的变量。


用 C 模拟:

int a = 10;
int *const ref = &a;  // const pointer to int
*ref = 20;
  • ref 这个指针是 const 的,不能再改地址,只能指向 a
  • 你可以通过 *ref 改变 a 的值。

是不是和 C++ 引用的行为几乎一致?✅


❗ 但引用 ≠ const 指针

我们再强调几点区别:

对比点C++ 引用 (int&)C 中的 const 指针 (int* const)
是否有独立地址❌ 通常没有✅ 有自己的内存地址
是否可能为 null❌ 不可以✅ 可以初始化为 NULL
是否需要解引用操作❌ 不需要✅ 需要写 *ptr
编译器会做语义检查✅ 是引用语义❌ 是指针语义

🎯 结论:

✅ 所以:

引用本质上更像编译器“自动生成指针解引用”的行为,语义上接近一个不能改地址的指针(const pointer),但它不是指针。

  • 你可以用 const 指针来类比学习引用
  • 但编译器内部并不是简单地“把引用转成 const 指针”这么简单,它还会做很多额外的语义处理,比如绑定规则、引用折叠、生命周期延长等。

想深入底层?

如果你愿意,我可以给你看一段 C++ 编译成汇编之后,引用变量是怎么处理的,或者用 clang -S 生成 .s 文件观察引用是如何被“消失”的(因为它真的不会生成实体地址)。

是否继续?👀

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

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

相关文章

学习笔记086——@PostConstruct注解和InitializingBean接口的使用

文章目录 1、PostConstruct注解1.1 介绍1.2 用法1.3 场景 2、InitializingBean接口2.1 介绍2.2 用法 1、PostConstruct注解 1.1 介绍 PostConstruct 是 Java EE/Jakarta EE 中的一个注解&#xff0c;用于标记一个方法在依赖注入完成后执行初始化操作。它通常与 Spring 框架一…

考研系列—408真题操作系统篇(2015-2019)

目录 # 2015年 1.死锁处理 (1)预防死锁 (2)避免死锁 (3)死锁检测和解除 2.请求分页系统的页面置换策略、页面置换策略 3.页、页框、页表,基本分页系统 # 2016年 1.异常、中断 2.页置换算法 3.进程的互斥操作 4.SPOOLing技术(从软件方面实现设备共享) 5.一定要牢记…

argocd部署cli工具并添加k8s集群

先决条件: 1.已经有k8s集群,(网上一万种部署方式,这里我使用的是kubekey部署的),也埋了个坑,后面说明. 2.已经部署好argocd,并验证web已经可以访问.参见 k8s部署argocd-CSDN博客 部署客户端工具, 这里我是从web页面上直接下载的对应版本的cli工具. 打开已经部署好的argoc…

打卡day52

简单cnn 借助调参指南进一步提高精度 基础CNN模型代码 import tensorflow as tf from tensorflow.keras import layers, models from tensorflow.keras.datasets import cifar10 from tensorflow.keras.utils import to_categorical# 加载数据 (train_images, train_labels),…

OpenGL ES绘制3D图形以及设置视口

文章目录 关于 glDrawElements基本概念使用场景mode 绘制模式type 索引数据类型indices 索引缓冲区工作原理绘制正方体实例 视口透视投影&#xff08;Perspective Projection&#xff09;正交投影&#xff08;Orthographic Projection&#xff09;正交投影和透视投影对比 关于 …

【SAS求解多元回归方程】REG多元回归分析-多元一次回归

多元一次回归是一种统计方法&#xff0c;用于分析多个自变量&#xff08;解释变量&#xff09;与一个因变量&#xff08;响应变量&#xff09;之间的线性关系。 目录 【示例】 基本语法 SAS代码 参数估计 方差分析 回归统计量 y的拟合诊断 y的回归变量值 【示例】 设Y…

卡通幼儿园教育通用可爱PPT模版分享

幼儿园教育通用PPT模版&#xff0c;教育教学PPT模版&#xff0c;卡通教育PPT模版&#xff0c;可爱卡通教学课件PPT模版&#xff0c;小清新动物卡通通用PPT模版&#xff0c;教学说课通用PPT模版&#xff0c;开学季PPT模版&#xff0c;国学颂歌PPT模版&#xff0c;可爱简约风PPT模…

力扣HOT100之技巧:75. 颜色分类

这道题实际上就是让我们不用sort()函数来实现对原数组的排序&#xff0c;这里我直接使用快速排序对原数组进行排序了&#xff0c;也是复习一下基于快慢指针的快速排序写法。面试手撕快排的思路参考这个视频。 用时击败100%&#xff0c;还行。下面直接贴代码。 class Solution …

离线部署openstack 2024.1 keystone

控制节点身份服务 离线下载 apt-get install --download-only keystone python3-openstackclient apache2 libapache2-mod-wsgi-py3mkdir /controller/keystone mv /var/cache/apt/archives/*.deb /controller/keystone/ dpkg -i /controller/keystone/*.deb在一个控制节点操…

帆软 BI 从入门到实战全攻略(一):安装激活与添加数据

一、帆软 BI 产品概述​ 在当今大数据时代&#xff0c;数据分析与可视化成为企业洞察业务、驱动决策的关键利器。帆软软件有限公司作为中国专业的大数据 BI 和分析平台提供商&#xff0c;自 2006 年成立以来&#xff0c;凭借其在商业智能和数据分析领域的深耕细作&#xff0c;…

网络协议通俗易懂详解指南

目录 1. 什么是网络协议? 1.1 协议的本质 1.2 为什么需要协议? 1.3 协议分层的概念 2. TCP协议详解 - 可靠的信使 📦 2.1 TCP是什么? 2.2 TCP的核心特性 🔗 面向连接 🛡️ 可靠传输 📊 流量控制 2.3 TCP三次握手 - 建立连接 2.4 TCP四次挥手 - 断开连接…

量子加速器切入 AI 底层架构!能源焦虑时代,ORCA 正在改写数据中心的计算逻辑

内容来源&#xff1a;量子前哨&#xff08;ID&#xff1a;Qforepost&#xff09; 文丨浪味仙 排版丨浪味仙 行业动向&#xff1a;2000字丨5分钟阅读 人工智能的飞速发展&#xff0c;令计算需求呈现爆炸式增长&#xff0c;也催生出专为 AI 设计的新型计算基础设施形态——AI…

< 买了个麻烦 (二) 618 京东云--轻量服务器 > “可以为您申请全额退订呢。“ 工单记录:可以“全额退款“

事情进展是这样的&#xff1a; 海外接听 一分钟 1-2 元&#xff0c;具体多少要问联通。 这几天接电话&#xff0c;有点儿心烦&#xff0c;看见来自 010-86310548 以为是 ICP 备案&#xff0c;结果接起来全是 VPS &#xff08;轻量应用服务器&#xff09;这个工单&#xff0c;就…

接口限频算法:漏桶算法、令牌桶算法、滑动窗口算法

文章目录 限频三大算法对比与选型建议一、漏桶算法&#xff08;Leaky Bucket Algorithm&#xff09;1.核心原理2.实现3.为什么要限制漏桶容量4.优缺点分析 二、令牌桶算法&#xff08;Token Bucket Algorithm&#xff09;1.核心原理2.实现&#xff08;1&#xff09;单机实现&am…

HTML5 盒子模型

1. 盒子模型的概念 2. 边框&#xff08;border&#xff09; 边框颜色&#xff08;border-color&#xff09; 边框粗细&#xff08;border-width&#xff09; 边框样式&#xff08;border-style&#xff09; border简写&#xff08;border&#xff1a;&#xff09; 3. 外边距&am…

【Linux】Linux高级I/O

参考博客&#xff1a;https://blog.csdn.net/sjsjnsjnn/article/details/128345976 一、五种IO模型 阻塞式I/O非阻塞式I/OI/O复用&#xff08;多路转接&#xff09;信号驱动式I/O异步I/O I/O我们并不陌生&#xff0c;简单的说就是输入输出&#xff1b;对于一个输入操作通常包…

关于界面存在AB测试后UI刷新空白的问题

问题描述&#xff1a; 在同一页面存在AB面&#xff0c;A和B同时都有一个rv&#xff0c;然后A面的rv填充不了数据&#xff0c;B面的可以。 问题解决&#xff1a; header_task布局里的include_new_gift_sign里有一个和外层一样id的recyclerview include的标签的作用是。在infl…

Go 协程(Goroutine)入门与基础使用

一、什么是协程&#xff08;Goroutine&#xff09;&#xff1f; 简单来说&#xff0c;协程是由 Go 语言运行时管理的轻量级线程。相比系统线程&#xff0c;它的调度开销极小&#xff0c;内存占用非常少&#xff08;默认只需 2KB 栈空间&#xff09;。 你可以在一个程序中轻松…

matlab 各种智能优化算法

1. 优化算法相关 蚁群优化算法&#xff08;ACO&#xff09; 蚁群优化算法是一种模拟蚂蚁觅食行为的优化技术。以下是一个简化版的ACO用于解决旅行商问题&#xff08;TSP&#xff09;的MATLAB代码&#xff1a; function [bestRoute, minDist] acoTsp(distMatrix, numAnts, n…

Hilt -> Android 专属依赖注入(DI)框架

Hilt 是 Google 基于 Dagger 封装的 Android 专属依赖注入&#xff08;DI&#xff09;框架&#xff0c;显著简化了依赖管理流程&#xff0c;提升代码可维护性和可测试性。以下是核心要点及使用指南&#xff1a; dagger2: Dagger 2 原理和使用-CSDN博客 Hilt vs Dagger2&…