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

C++基础(7):引用类型

一、什么是引用?先搞懂核心概念

对于零基础同学来说,不用先记复杂定义,咱们用生活化的例子理解:引用就是变量的“别名”,和外号一个道理。

比如你大名叫张三,朋友叫你小三,这两个名字指的都是同一个人,不管叫哪个,喊的都是你,修改你本身的状态,两个名字对应的结果都会变。

放到C++里,引用就是给已经存在的变量再起一个名字,引用本身不占用独立内存空间,它和原变量共用同一块内存地址,操作引用,本质就是操作原变量。

核心前提:引用必须依附于已有的变量,不能凭空定义一个引用,没有变量就没有别名。

二、引用的基础语法(零基础直接照搬)

1. 定义格式

数据类型 & 引用名 = 原变量名;

重点:& 在这里不是取地址符,是引用的声明符号,和指针的取地址要区分开!

2. 最简单示例

#include<iostream>usingnamespacestd;intmain(){// 定义原变量inta=10;// 定义引用b,是a的别名int&b=a;// 输出原变量和引用的值,结果都是10cout<<"原变量a的值:"<<a<<endl;cout<<"引用b的值:"<<b<<endl;// 修改引用b的值,原变量a也会跟着变b=20;cout<<"修改引用后,a的值:"<<a<<endl;cout<<"修改引用后,b的值:"<<b<<endl;return0;}

3. 运行结果

原变量a的值:10

引用b的值:10

修改引用后,a的值:20

修改引用后,b的值:20

结论:修改引用,原变量同步改变,二者完全绑定,不可拆分。

三、引用的核心注意事项(零基础必记,避坑关键)

这部分是面试和写代码最容易出错的点,一定要逐条记牢,上下文理解不混乱:

  • 引用必须初始化,不能先定义再赋值
    错误写法:int &b; b = a; 正确写法:int &b = a; 原因:引用从诞生开始就要绑定变量,不能先空着再找依附对象。

  • 引用一旦绑定变量,终身不能更换绑定对象
    示例:int a=10, c=30; int &b = a; b = c; 这里不是把b改成c的引用,只是把c的值赋值给b(也就是给a赋值),b依然是a的别名,这是新手最容易踩的坑!

  • 引用只能绑定变量,不能绑定常量
    错误写法:int &b = 10; 正确写法:const int &b = 10; 普通引用只能依附变量,常量必须用常引用。

  • 引用和原变量地址完全相同
    可以用取地址符验证:cout << &a << endl; cout << &b << endl; 输出地址一模一样,证明共用一块内存。

  • 引用的类型必须和原变量一致
    错误写法:int a=10; double &b = a; 类型不匹配,编译器直接报错,必须严格对应。

四、常引用(const引用):只读的别名

如果希望引用只能读取变量值,不能修改原变量,就用const修饰引用,叫做常引用。

语法

const 数据类型 & 引用名 = 原变量名;

示例

inta=10;// 常引用,只能读,不能改constint&b=a;// 正确:读取值cout<<b<<endl;// 错误:不能修改,编译器报错// b = 20;

适用场景:函数参数传递,防止函数内部误修改原变量,保护数据安全。

五、引用和指针的区别(零基础易混淆,对比理清)

很多零基础同学会把引用和指针搞混,这里用表格清晰区分,避免上下文混乱:

对比项引用指针
本质变量的别名,无独立内存存放变量地址的变量,占用内存
初始化必须初始化,绑定后不可更换可以不初始化,后期可修改指向
操作直接操作原变量,不用解引用需要*解引用才能操作原变量
空值不能为空,必须绑定变量可以为空指针(NULL/nullptr)
简单记:引用更安全,用法更简单;指针更灵活,但是容易出错

六、引用的常用场景(零基础必学实战用法)

1. 函数参数传递(最核心用法)

普通函数传参是值传递,会拷贝一份数据,函数内部修改的是拷贝值,原变量不变;
用引用做参数,是直接传递原变量本身,函数内部修改会直接改变原变量,还能节省内存拷贝的开销。

#include<iostream>usingnamespacestd;// 引用做参数,直接修改原变量voidchangeNum(int&num){num=100;}intmain(){inta=10;changeNum(a);// 输出100,原变量被修改cout<<a<<endl;return0;}

2. 函数返回值(少用,注意生命周期)

引用可以做函数返回值,但是绝对不能返回局部变量的引用,局部变量函数执行完就销毁,引用会变成悬空引用,导致程序崩溃。

#include<iostream>usingnamespacestd;inta=10;// 返回全局变量的引用,合法int&getNum(){returna;}intmain(){// 接收引用返回值,修改全局变量getNum()=20;cout<<a<<endl;return0;}

七、零基础总结(一句话吃透引用)

引用就是变量的别名,必须初始化、绑定后不可更改,和原变量同地址、同内存,主要用来做函数参数,实现直接修改原变量、节省内存开销,用法简单且安全,是C++新手必须掌握的基础语法。

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

相关文章:

  • 农业四情监测系统
  • MYSQL入门学习教程(非常详细),零基础入门到精通,收藏这一篇就够了_mysql学习
  • Cesium Terrain Builder技术解析:从原理到实践的完整指南
  • 打造同城生活服务一站式平台 全面覆盖同城信息、商家联盟、生活电商等多元场景
  • 科研数据可视化工具推荐:适配场景,高效呈现科研价值
  • 如何用 PS 去除图片上的杂物?新手必学的4种方法
  • 2026年度CRM系统生态盘点,9款主流厂商核心能力解析
  • FigmaCN实战指南:打造高效界面汉化解决方案
  • 2026年度光伏设备高端橡胶密封制品供应商深度评测:谁在定义行业新标准? - 资讯焦点
  • 3种核心技术让WindowsCleaner实现C盘空间翻倍
  • 突破效率边界:TMSpeech智能语音识别效率工具全解析
  • PS 如何快速溶图?人物与背景自然融合教程详细步骤
  • CarSim-Simulink联合仿真:ACC自动巡航跟随控制策略实现与跟车效果展示
  • 基于PHP的微信AI智能客服系统源码:消息接收与自动回复的实现
  • 利用PHP构建一个简单的AI智能客服源码系统
  • 41514154154154154154514514
  • 告别论文焦虑:Paperxie 降重 + 降 AIGC 双效方案,让学术写作更从容
  • PHP实现在线微信客服源码系统消息的实时推送与处理
  • 突破游戏本性能桎梏:OmenSuperHub的智能调控技术革命
  • AGP、Gradle和Jdk之间的关系
  • CSDN运维笔记|360CDN配置教程,跨网加速+缓存优化实测
  • 分享一套PHP原创开发的微信AI智能客服系统源码,结构清晰,适合二次开发
  • 从“审价”到“计价”:一文读懂装备价格审核与军用软件成本评估
  • 音视频传输问题总结
  • OpenRocket火箭仿真软件完全掌握:从设计到发射的终极技术指南
  • AI“养虾”热潮:成本、安全与行业隐忧
  • 利用USB分析仪排查HID故障记录(2)——丢包问题
  • 反向传播的计算顺序
  • Hume: Introducing System-2 Thinking in Visual-Language-Action Model
  • OpenClaw爆火:AI执行革命背后的机遇与挑战