当前位置: 首页 > news >正文

C++入门,到底如何理解引用?

对很多从C入门到C++的小伙伴来说,在C++的引用和指针上总是搞不清楚两者的区别,看完本篇内容你就能彻底理解C++为什么要引入引用这个概念,以及如何运用引用如何区别引用与指针。


引用的概念与定义

引用不是定义一个新的变量,而是给已存在的变量起一个别名,引用变量和被引用变量共同使用同一块内存空间。

使用格式

类型& 引用别名=引用对象;

引用的特性

1.引用在定义时必须初始化。

int& b;//err

2.一个变量可以存在多个引用。

int a=0; int& b=a; int& c=a;//ok

3.引用一旦引用一个实体,再不能引用其他实体。

引用的使用

引用大多数的使用场景是引用传参和传引用返回,其相较于使用指针的优点是减少拷贝提高效率和改变引用对象时同时改变被引用对象。

用指针写一个swap函数实现交换:

void swap(int* x,int* y) { int temp=*x; *x=*y; *y=temp; } void main() { int a=1; int b=2; swap(&a,&b); }

用引用写一个swap函数实现交换:

void swap(int& x,int& y) { int temp=x; x=y; y=temp; } void main() { int a = 1; int b = 2; swap(a, b); }

相当于给变量a和b取了个别名x和y,修改x和y就等于修改了a和b。不用像使用指针那样麻烦、晦涩。

对于有参数的函数,在主函数中要给该函数传参时,编译器会给该函数分配一个新的内存空间用来存放参数,当传的参数规模足够大时,付出的代价会很大,体现在:

1.内存消耗翻倍:同时存在两份完全一样的数据。

2.时间消耗大:复制大量数据需要遍历内存、执行赋值。

3.额外开销:复制完成后,原来的数据可能根本不再需要。

而使用引用传参则不需要另外提供新的内存空间,而是对实参直接进行操作,大大提高运行效率,降低运行成本。

const引用

引入:对象的访问权限在引用过程中可以缩小,但是不能放大。

void mian() { const int a=0; int& b=a;//err }

const修饰一个变量相当于把变量变成了常量,不允许改变,而b引用a时没有添加const修饰,权限被放大,是不被允许的。

正确示例:

void main() { const int a=0; const int& b=a; }

同时权限允许被缩小,例如:

void main() { int a=0; const int& b=a; a=1;//ok b=2;//err }

解释:这里的const int& b=a只是给a起了一个只读别名,它限制的是通过b去修改a的行为,但并不能改变a本身的类型属性。

可以引用一个const对象,但必须用const引用。const引用也可以引用普通对象。

另外,在一些使用引用的场景里,引用通常引用的是一个临时对象,而在C++中规定临时对象具有常性,在使用引用时要用const修饰,避免权限放大。

例如:

void main() { double a=1.11; int b=a;//ok int& c=a;//err const int& c=a;//ok }

解释:编译器尝试进行隐式转换double->int时,会生成一个临时 int 对象。而这个临时int对象具有常性,应该被const修饰。

指针和引用的关系

1.语法概念上引用是一个变量的取别名不开空间,指针是存储一个变量的地址,需要开一个指针大小的空间。

2.指针容易出现野指针的问题,引用则很少出现,引用相对安全一些。

3.引用在定义时强制进行初始化,指针则不强制初始化。

4.引用不可以改变指向,而指针可以不断的改变指向。

引用和指针在实践中是相辅相成的,有些数据结构的场景中引用无法替代指针,二者各有特点。



以上就是引用的用法及引用与指针的区别和联系,感谢观看!

http://www.jsqmd.com/news/843916/

相关文章:

  • KLayout 0.30.5:macOS版EDA工具的技术决策树与部署策略深度解析
  • 视频核心技术 06:FFmpeg 核心原理 + 常用命令实战 —— 转码、截图、推流、排错
  • 深耕江城数字营销 云企琦打造一站式广告推广服务商 - 资讯焦点
  • 西林瓶外观缺陷 AI 检测|医药行业标准化落地流程
  • Pearcleaner终极指南:为什么这款Mac清理工具能彻底释放你的磁盘空间?
  • 面向对象分析(OOA)的第一个步骤是**识别问题域中的对象和类**(也称为“识别对象与类”或“确定问题域中的概念类”)
  • 量子优化技术在工业数据生产规划中的应用与实践
  • 微软:小模型替代大模型执行终端任务
  • 服务器训练过程程序崩溃,显卡资源释放方式
  • IDA逆向分析实战:破解函数限制、修复栈平衡与Switch识别
  • 全志H713/H618平台:调焦步进电机驱动原理与DTS配置实战解析
  • 注意力不集中影响的不只是成绩,更是孩子的一生 - 资讯焦点
  • 猫抓插件完全指南:浏览器资源嗅探与下载的终极解决方案
  • 企业如何搭建标准化问卷调研系统?全流程方法论(附平台推荐)
  • 静态查找,冒泡,快排
  • 还在熬夜调格式?Paperxie 论文排版功能:一键搞定全高校规范,让格式问题不再卡你毕业
  • 宁波车主挑靠谱汽车贴膜机构的3步避坑指南 - 速递信息
  • 项目介绍 基于java+vue的校园舆情监测与预警系统设计与实现(含模型描述及部分示例代码)专栏近期有大量优惠 还请多多点一下关注 加油 谢谢 你的鼓励是我前行的动力 谢谢支持 加油 谢谢
  • `SaveKeyDataAsync` 重构优化版本
  • ARM A64 SIMD向量指令详解与优化实践
  • 如何彻底清理Windows驱动存储:5个专业技巧释放系统空间
  • Nucleus Co-Op终极指南:3分钟让单机游戏变多人分屏神器
  • 用Python+NetworkX复现经典:手把手教你用Frank Wolfe算法搞定交通分配UE模型
  • Equalizer APO终极指南:免费打造Windows专业级音频系统
  • CA-IS3741:四通道高速数字隔离芯片的选型、实测与光耦替代实战
  • 5步彻底解决XXMI-Launcher游戏模组管理难题
  • 金价高位期必看!2026 深圳黄金回收机构真实测评! - 奢侈品回收测评
  • STM32新手必看:Keil MDK编译遇到warning #2803-D和L6218E错误?保姆级解决流程来了
  • Windows Cleaner终极指南:如何快速优化系统性能与清理C盘空间
  • CSS 实现「上双下单」布局