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

小学生学C++编程语法知识(C++函数 :6、引用传递)


C++函数 第六课

《神奇的双胞胎名字——引用传递(Reference Passing)》


本课学习目标

学完本课,同学们能够:

✅ 理解为什么需要引用传递

✅ 理解引用(Reference)是变量的"别名"

✅ 掌握引用传递的写法

✅ 能解释引用传递为什么能够修改外部变量

✅ 能区分值传递和引用传递


第一幕:复制魔法太麻烦了

1、上一节课,我们学会了值传递。

(1)画图。

a = 10 ↓ 复制 ↓ x = 10

(2)修改:

x = 100;

(3)最后:

a = 10 x = 100

(4)函数结束。

x 消失

(5)所以:

外面的:

a 没有变化。

2、汉克老师问大家:

如果说:

"我就是要修改a!"

怎么办?

复制。

显然做不到。


第二幕:程序王国的新魔法

1、国王请来了最厉害的大魔法师。

他说:

"以后不要复制了。"

大家都愣住了。

那怎么办?


2、魔法师说:

"给它再起一个名字!"

画图。

(1)以前:

a 10

(2)现在:

a 10 ↑ ↓ x

(3)注意!

不是两个变量。

而是:

一个变量。

两个名字。


3、汉克老师给同学们讲:

引用不是新变量。

引用只是变量的另一个名字。


第三幕:生活中的别名

1、例如:

(1)一个同学。

大名:

张小明

(2)家里叫:

明明

(3)学校同学叫:

小明

(4)是不是三个人?

当然不是。


(5)还是:

同一个人。

只是:

三个名字。

引用就是这样。


2、变量也是这样:

一个变量,通过引用,也可以有几个名字。


第四幕:认识"&"

我们开始写代码。

#include <iostream> using namespace std; void change(int &x) { x = 100; } int main() { int a = 10; change(a); cout << a << endl; return 0; }

(1)运行后:

100

全班同学都会惊讶了,

为什么?


(2)汉克老师画图。

以前:

a ↓ 复制 ↓ x

现在:

a ↑ ↓ x

没有复制。

所以:

修改:

x = 100;

其实就是:

a = 100;

第五幕:"&"是什么意思?

1、很多老师都会讲到:

"&" 就是取地址。

汉克老师这里一定要强调:

在这里:

int &x

里面的:

&

表示:

引用。


2、意思就是:

给原来的变量起一个新的名字。

并不是创建一个新的变量。


第六幕:引用传递全过程

我们画一下完整流程。

main a = 10 ↓ change() ↓ x ↓ 其实就是a ↓ x = 100 ↓ a也变成100 ↓ 函数结束 ↓ a仍然100

第七幕:交换两个数字

1、值传递

void swap(int a,int b) { int t = a; a = b; b = t; }

调用:

int x = 3; int y = 8; swap(x,y);

输出:

3 8

为什么没交换?

因为:

复制。


2、引用传递

void swap(int &a,int &b) { int t = a; a = b; b = t; }

调用:

swap(x,y);

输出:

8 3

真正交换成功。


第八幕:值传递 VS 引用传递

1、画图。

(1)值传递:

a ↓ 复制 ↓ x

(2)引用传递:

a ↑ ↓ x

2、一句话总结:

值传递:

变量复制后,复制件传过去。

引用传递:

变量自己传过去。


第九幕:为什么引用更快?

1、举例。

一本:

1000页。

百科全书。


2、两种方式进行比较

(1)使用值传递:

复制一本。


(2)引用传递:

直接借原书。


(3)哪个快?

引用传递快


3、所以,大型数据。

例如:

数组。

vector。

字符串。

一般:

都用引用传递。


第十幕:什么时候应该用引用?

1、如果,希望修改外面的变量。

例如:

交换。

排序。

输入。

统计。

适合:

引用传递。


2、如果,只是使用变量的值,不需要修改变量。

值传递也可以。


第十一幕:引用有没有危险?

1、如果,很多函数,都能修改同一个变量。

(1)是不是:

有可能:

被不小心修改了?


(2)所以。

引用:

虽然方便。

但是:

要注意,不能乱改。


2、看代码:

#include <iostream> #include <string> using namespace std; // 函数声明:使用 const 引用传递参数 // const int& a: 表示 a 是传入变量的别名,且在该函数内不可被修改 // const int& b: 同理 int add(const int& a, const int& b) { // a = 10; // 错误!编译器会报错,因为 a 是 const 引用,不能修改 return a + b; } // 对于大型对象(如 string),const 引用的优势更明显 void printMessage(const string& msg) { // msg += " extra"; // 错误!不能修改 msg cout << "Message: " << msg << endl; } int main() { int x = 10; int y = 20; // 调用函数 int sum = add(x, y); cout << "Sum: " << sum << endl; // 传递普通变量 string text = "Const reference is safe."; printMessage(text); return 0; }

3、const引用参数传递的重要性

(1)性能优化:避免不必要的拷贝

  • 值传递的问题‌:如果使用值传递,每次调用函数时,编译器都会创建实参的一个完整副本。对于基本类型(如intdouble),拷贝开销很小;但对于大型对象(如stringvector、自定义类对象),拷贝涉及内存分配和数据复制,效率极低。

  • 引用的优势‌:引用传递(&)不创建副本,因此速度极快。

  • 结论‌:使用引用传递可以显著提升程序运行效率,特别是当参数是大对象时。


(2)安全性:防止意外修改实参

  • 普通引用的风险‌:如果使用非const引用(如void func(int& a)),函数内部可以直接修改传入的变量。这可能导致意想不到的副作用,破坏原始数据。

  • const 的保护作用‌:加上const后(const int& a),编译器会强制检查函数体内部是否尝试修改该参数。如果有修改操作,编译阶段就会报错。

  • const提供了“只读”保证,增强了代码的健壮性和安全性,明确告知调用者:“我只读取数据,不会改变它”。


第十二幕:课堂综合案例

1、成绩加分程序

#include <iostream> using namespace std; void addScore(int &score) { score += 5; } int main() { int score = 90; cout << "加分前:" << score << endl; addScore(score); cout << "加分后:" << score << endl; return 0; }

运行结果:

加分前:90 加分后:95

让同学们画图:

score 90 ↑ ↓ score(引用) ↓ 95

同学们理解了:

修改的是同一个变量。


第十三幕:值传递与引用传递对比实验

#include <iostream> using namespace std; void fun1(int x) { x++; } void fun2(int &x) { x++; } int main() { int a = 10; fun1(a); cout << a << endl; fun2(a); cout << a << endl; return 0; }

运行结果:

10 11

同学们来解释下:

为什么第一次没变?

为什么第二次变了?

学生请画出"复制"和"别名"两张图。


本课总结

今天,我们学习了程序王国一种新的魔法——引用传递。请记住五句话:

  1. 引用不是创建新变量,而是给原变量起一个新的名字(别名)。

  2. 引用传递不会复制数据。

  3. 修改引用,就是修改原变量。

  4. 引用传递通常比值传递效率更高,特别适合较大的数据。

  5. 是否修改原变量,是选择值传递还是引用传递的重要依据。

  6. 防止意外修改实参,可以使用const引用。


课堂挑战

1、请编写下面两个函数:

void addOne1(int x); void addOne2(int &x);

2、然后分别调用:

int n = 20; addOne1(n); cout << n << endl; addOne2(n); cout << n << endl;

3、思考:

为什么第一次输出还是20,第二次却变成了21


4、同学们,建立下面两张"心智模型图":

(1)值传递

实参 │ │ 复制 ▼ 形参

(2)引用传递

实参 ▲ │ ▼ 形参(别名)

📚 课后拓展

引用已经不用复制了,那为什么 C++ 还有"指针传递"呢?

"引用像是给朋友起了一个小名,而指针更像是拿到了一张写着家庭住址的纸条。下节课,我们就去学习程序王国里神奇的'地址魔法'——指针传递。"


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

相关文章:

  • Agent 事件驱动架构:用消息驱动替代轮询等待
  • 小白程序员轻松入门大模型,2026年AI学习路线图(附免费资源)
  • 炉石传说增强插件HsMod终极指南:55项功能全解锁
  • 终极赛博朋克2077存档编辑器:完全掌控夜之城的10个技巧
  • 从0到1掌握Agents-A1-4bit:环境配置、API调用与高级功能全攻略
  • Cosmos-AnomalyGen-Glass-2B完全指南:从安装到生成高质量手机屏幕异常图像
  • 抖音无水印下载器完全指南:从单视频到批量下载的完整解决方案
  • 外挂瓶冻干机市场品牌盘点汇总:恒美智造冷冻干燥机居龙头地位 - 专业仪器测评品牌推荐
  • 一文读懂LatentMoE架构:NVIDIA-Nemotron-3-Ultra-550B-A55B-Base-BF16如何实现550B参数高效运行
  • 商场有4㎡空地就够了?真正占位置的是一局开始以后的人满为患
  • 让经典游戏在现代Windows上重生:dxwrapper完整兼容性解决方案
  • JavaFX CSS @font-face 错误全面分析 loadStylesheetUnPrivileged / reportException
  • 2026年芜湖市靠谱装修公司有哪些:透明报价拒绝增项,品质施工售后无忧 - 速递信息
  • 终极Wand-Enhancer指南:三步免费解锁WeMod专业版完整功能
  • GTA 5终极增强菜单YimMenuV2:新手快速上手指南
  • Unity3D集成深度学习:ONNX Runtime与C# Job System实战指南
  • 探索mlx-community/gemma-4-31b-it-4bit的量化奥秘:4-bit如何实现31B参数高效运行
  • Alot高级配置:Python钩子与自定义格式化让邮件管理更智能
  • 2026康复护理科普,缺少屏障修复会延缓猫咪炎症消退 - 思溯深度专栏
  • 3步搞定:Windows免费Syslog服务器从部署到实战
  • 2026广州黄金回收行情实测,金条旧金统一大盘价差透明计价 - 禹竞奢收行
  • 海口香奈儿包包怎么卖最贵?2026易奢福源头渠道,热门款出价碾压同城同行 - 奢侈品回收实体店
  • 终极免费音乐解决方案:Spotube跨平台音乐播放器完全指南
  • PMBus寄存器映射详解:从硬件抽象到数字电源精准控制
  • 3分钟学会用Mermaid Live Editor:零代码绘制专业图表的秘密武器
  • 南大通用GBase 8s数据库集群切换模式对比与运维建议
  • Godot游戏开发:一张白图实现动态变色血条系统
  • Boogu-Image-0.1-Edit-4bit核心技术解析:DiT+FLUX.1 VAE+FlowMatchEuler三大架构深度剖析
  • 买二手手机不踩雷:平台商品页要重点看什么? - 资讯快报
  • 路桥区黄金回收5家门店实地深度测评|2026路桥卖黄金避坑完整版 - 得天独厚