如何判断函数是值传递还是引用传递?附代码相关疑问
关于C++ sumAndDifference函数的传递方式与打印区别的解答
首先先把你提供的代码补全(方便后续解释):
#include <iostream> using namespace std; void sumAndDifference(int n1, int n2, int sum, int diff) { sum = n1 + n2; diff = n1 - n2; // 如果在函数内打印 // cout << "函数内的sum: " << sum << ", 函数内的diff: " << diff << endl; } int main() { // 注意:标准C++中main函数必须返回int,不是void哦 int sum = 0, diff = 0, x = 200, y = 88; sumAndDifference(x, y, sum, diff); cout << "\n Sum is..." << sum << ", Difference is..." << diff << endl; return 0; }
一、如何判断函数采用的是值传递还是引用传递?
判断方式非常直接,看函数参数的声明格式:
- 值传递:参数声明是
类型 变量名的形式,比如这个函数里的int n1、int sum,没有任何额外的符号。这种传递方式下,函数会创建实参的独立副本,函数体内对参数的修改只会作用于这个副本,和原始实参无关。 - 引用传递:参数声明会带有
&符号,比如int& sum,这时候函数直接操作原始实参的别名,修改会同步到原始变量上。
回到你的代码,sumAndDifference的四个参数都是纯int类型的变量声明,没有&,也没有指针(指针是int*形式),所以这个函数完全采用的是值传递。你可以运行代码验证:main函数里打印的sum和diff依然是初始值0,因为函数里修改的只是副本,根本没碰main里的原始变量。
二、函数体内打印值与main函数中打印值的区别?
这本质是变量作用域和传递机制带来的差异,具体有三点:
- 操作的变量不是同一个:函数体内打印的是函数参数的副本(属于sumAndDifference函数的局部变量),而main函数里打印的是main自己定义的局部变量sum和diff,二者在内存中是完全独立的两块空间。
- 输出的值可能完全不同:比如你的代码里,函数体内打印sum会得到288(200+88)、diff得到112(200-88);但main函数调用完函数后打印的sum和diff还是0——因为副本的修改不会影响原始变量。
- 变量的生命周期不同:函数体内的参数副本只在sumAndDifference函数执行期间存在,函数执行完毕就会被销毁;而main里的变量会一直存在到main函数执行结束(也就是程序退出)。
如果想让函数能修改main里的sum和diff,把参数改成引用传递就可以了,修改后的函数如下:
void sumAndDifference(int n1, int n2, int& sum, int& diff) { sum = n1 + n2; diff = n1 - n2; }
这时候再运行代码,main里打印的就是正确的288和112了。
内容的提问来源于stack exchange,提问作者N.Essam
相关产品推荐
相关产品推荐

