小学生学C++编程语法知识(C++函数 :5、函数值的传递) C函数 第五课《神奇的复制魔法——值传递Value Passing》本课学习目标学完本课同学们能够✅ 理解什么是值传递✅ 知道为什么函数里修改变量不会影响外面的变量✅ 能画出值传递的数据变化过程✅ 理解复制与原件的区别✅ 为学习引用传递做好准备第一幕魔法王国里的奇怪现象1、今天小明发现了一件非常奇怪的事情。他写了这样一段程序#include iostream using namespace std; void change(int x) { x 100; } int main() { int a 10; change(a); cout a endl; return 0; }2、程序会输出什么小明认为应该是输出100因为函数里面不是把x改成100了吗可是运行结果却是10小明很纳闷这是为什么第二幕小明真的把数字改了吗1、在函数里面x 100;是不是执行了答案执行了。2、那为什么外面的a没有变到底哪里出了问题第三幕神奇的复制机1、老师拿出一台机器。叫魔法复制机。2、原来是这样change(a);1真正发生的是a 10 ↓ 复制 ↓ x 102注意这里不是把a搬进去。而是复制了一份。3于是现在有两个变量。a 10 x 10它们已经不是同一个人了。第四幕修改的是谁1、继续执行x 100;现在a 10 x 1002、我们画图。┌───────┐ a 10 └───────┘ ┌───────┐ x 100 └───────┘是不是已经完全分开3、所以函数结束。x 消失剩下a 还是10所以输出10第五幕生活中的复制1、举一个生活例子。1妈妈有一本故事书。把故事书拿去复印。得到一本新的。2于是原书 ↓ 复印 ↓ 副本3现在小明在复印件上画画。妈妈的原书会变吗当然不会为什么因为画的是副本。不是原件。值传递就是这样。第六幕动画演示值传递1、小明画完整流程。main a10 ↓ 调用 ↓ 复制 ↓ change x10 ↓ 修改 ↓ x100 ↓ 函数结束 ↓ x消失 ↓ a仍然10这一张图建议大家都画一下。大家都看下整个过程是如何变化的。第七幕再来看一个例子#include iostream using namespace std; void addOne(int num) { num; } int main() { int score 95; addOne(score); cout score endl; }1、最后输出答案952、因为增加的是num不是score第八幕多个参数也一样void test(int a,int b) { a; b; }1、调用int x5; int y8; test(x,y);2、画图。x ↓ 复制 ↓ a 5 y ↓ 复制 ↓ b 8修改a 6 b 9函数结束。全部消失。3、外面x 5 y 8一点没变。第九幕值传递的特点第一复制数据。第二修改副本。第三原变量不会改变。第四函数结束。副本消失。第十幕什么时候适合值传递1、如果只是读取数据。例如计算平方。int square(int x) { return x*x; }完全没问题。因为根本不需要修改外面的变量。2、再例如判断奇偶。bool isEven(int x)也适合。3、大多数函数其实都是值传递。第十一幕难道只有值传递吗1、值传递优点安全。缺点不能修改原变量。2、下一节课我们就学习程序王国神奇的魔法——引用传递。第十二幕课堂综合案例#include iostream using namespace std; void change(int x) { cout 函数开始时 x x endl; x 100; cout 函数结束时 x x endl; } int main() { int a 10; cout 调用前 a a endl; change(a); cout 调用后 a a endl; return 0; }运行结果调用前 a 10 函数开始时 x 10 函数结束时 x 100 调用后 a 10通过这段程序同学们可以非常直观地看到函数里的x和main()中的a并不是同一个变量而是复制出来的副本。本课总结今天我们学习了函数参数默认采用的值传递方式。请记住五句话值传递就是把实参复制一份交给形参。函数修改的是复制出来的副本不是原变量。函数结束后形参会自动销毁。因此值传递不会改变外面的变量。值传递安全、简单但复制大型数据时会增加开销。