C++ 里值传递(pass by value)和引用传递(pass by reference)的区别

我们先来看两段C++代码:

1
2
3
4
5
void swap1(int val1, int val2) {
	int temp = val1;
	val1 = val2;
	val2 = temp;
}

1
2
3
4
5
void swap2(int& val1, int& val2) { 
	int temp = val1;
	val1 = val2;
	val2 = temp;
}

请问我想要让两个变量的值交换,我应该使用swap1还是swap2呢?

1
2
3
4
5
6
7
int main() {
	int a = 10;
	int b = 100;
	swap(a,b); // swap1 还是 swap2 ?
	std::cout << "a:" << a << "\tb:" << b << std::endl;
    return 0;
}

经过验证,我们发现使用swap1并不能实现让两个值交换,而swap2能实现,这就引出了我们要讲的值传递引用传递


值传递(pass by value):

1
2
3
void func(int x) {
    x = 999;  // 改的是“副本”
}
  • 调用时,把实参的值复制一份给函数参数 x
  • 函数里改的是拷贝出来的副本不影响原来的变量
  • 就像你复印了一张身份证,然后在复印件上涂改——原件完全没变。

引用传递(pass by reference):

1
2
3
void func(int& x) {
    x = 999;  // 改的是“本尊”!
}
  • 调用时,没有复制x 就是原变量的另一个名字
  • 函数里对 x 的任何操作,直接作用在原来的变量上
  • 就像别人叫你“小明”或“阿明”,不管叫哪个名字,都是你本人,打你一下你真会疼 😅

综上所述:

值传参 → 操作副本,原变量安全;

引用传参 → 直接操作本体,原变量会被改。