小强要参加 NOI 编程比赛,老师要求每个人提交一份程序源码。小强写好后,想把文件发给三个同学检查。
他想了两种办法:
办法一:复制三份再寄。小强把源码文件复制了 3 份,每份发给一个同学。同学 A 在文件里加了注释,同学 B 改了一个变量名,同学 C 删了一行代码——但小强自己电脑上的原始文件一点没变,因为别人改的都是副本。
办法二:直接发原件。小强把原始文件直接发给三个同学,谁拿到就先改。同学 A 改了之后,文件就变成了改过的版本,同学 B 拿到的就是已经被改过的文件了。
"复制后寄的是副本,改别人的不改自己的——这就是传值;直接寄原件,谁改都影响原件——这就是传引用!"
老师笑着揭秘:函数传参的时候,C++ 默认就是"复制一份副本"传给函数(传值)。函数里怎么改副本,原变量都不会受影响。但如果用引用传递(传引用),函数拿到的就是原件的"别名",一改全改。
💡 这个故事告诉我们什么?
两种寄件方式有三个关键区别:
一、副本(传值):函数里改的是副本,原变量不变;原件(传引用):函数里改的就是原件本身,原变量跟着变。
二、副本要花时间复制大文件(效率低),原件直接给引用(效率高);
三、副本安全(不会误改),原件危险(一不小心就改了不该改的)。
程序里的函数传参也是如此。接下来我们就把"寄副本"和"寄原件"翻译成 C++ 语法。