C函数 第六课《神奇的双胞胎名字——引用传递Reference Passing》本课学习目标学完本课同学们能够✅ 理解为什么需要引用传递✅ 理解引用Reference是变量的别名✅ 掌握引用传递的写法✅ 能解释引用传递为什么能够修改外部变量✅ 能区分值传递和引用传递第一幕复制魔法太麻烦了1、上一节课我们学会了值传递。1画图。a 10 ↓ 复制 ↓ x 102修改x 100;3最后a 10 x 1004函数结束。x 消失5所以外面的a 没有变化。2、汉克老师问大家如果说我就是要修改a怎么办复制。显然做不到。第二幕程序王国的新魔法1、国王请来了最厉害的大魔法师。他说以后不要复制了。大家都愣住了。那怎么办2、魔法师说给它再起一个名字画图。1以前a 102现在a 10 ↑ ↓ x3注意不是两个变量。而是一个变量。两个名字。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 ↓ 复制 ↓ x2引用传递a ↑ ↓ x2、一句话总结值传递变量复制后复制件传过去。引用传递变量自己传过去。第九幕为什么引用更快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; } // 对于大型对象如 stringconst 引用的优势更明显 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性能优化避免不必要的拷贝‌值传递的问题‌如果使用值传递每次调用函数时编译器都会创建实参的一个完整副本。对于基本类型如int、double拷贝开销很小但对于大型对象如string、vector、自定义类对象拷贝涉及内存分配和数据复制效率极低。‌引用的优势‌引用传递不创建副本因此速度极快。‌结论‌使用引用传递可以显著提升程序运行效率特别是当参数是大对象时。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同学们来解释下为什么第一次没变为什么第二次变了学生请画出复制和别名两张图。本课总结今天我们学习了程序王国一种新的魔法——引用传递。请记住五句话引用不是创建新变量而是给原变量起一个新的名字别名。引用传递不会复制数据。修改引用就是修改原变量。引用传递通常比值传递效率更高特别适合较大的数据。是否修改原变量是选择值传递还是引用传递的重要依据。防止意外修改实参可以使用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第二次却变成了214、同学们建立下面两张心智模型图1值传递实参 │ │ 复制 ▼ 形参2引用传递实参 ▲ │ ▼ 形参别名 课后拓展引用已经不用复制了那为什么 C 还有指针传递呢引用像是给朋友起了一个小名而指针更像是拿到了一张写着家庭住址的纸条。下节课我们就去学习程序王国里神奇的地址魔法——指针传递。