
一起动脑筋 · 先看一个小故事
女孩交给机器人两张数卡 3 和 5,请它求和。函数怎样拿到这两张卡?
把过程摊开来看
- 调用处提供 3 和 5
- 函数入口形参接收值
- 计算3 加 5
- 返回结果 8
参数把调用处的数据带入函数。
按值传递时,形参获得值的副本。可以想成抄到函数自己的任务纸上,再用这些数计算。
01什么是参数?
函数常需要外部提供数据:
int add(int a, int b) {
return a + b;
}
a 和 b 是这个函数的参数。
02形参和实参有什么区别?
int result = add(3, 5);
实参(argument)
调用时提供的 3 和 5。
形参(parameter)
函数定义里的 a 和 b。
03C++ 默认怎样传参数?
普通参数默认是按值传递(pass by value)。
void change(int x) {
x = 100;
}
int n = 5;
change(n);
调用结束后,n 仍然是 5。
n = 5→复制值给 x→只修改 x 的副本
04为什么函数里改了 x,外面的 n 没变?
因为 x 是独立的形参对象,它得到的是 n 当前值的副本。
05如果真的想修改外面的变量呢?
可以使用引用参数:
void change(int& x) {
x = 100;
}
int n = 5;
change(n);
这次 x 引用的是 n,因此函数中的赋值会修改 n。
06只想高效读取大对象怎么办?
常见做法是使用 const 引用:
void printText(const std::string& text) {
std::cout << text;
}
这样不必按值复制整个字符串,同时函数也不能通过这个引用修改字符串。
07参数一定要有吗?
不一定。函数可以没有参数:
void showMenu() {
// ...
}
也可以有多个参数,参数数量和类型由函数接口决定。
你已经知道了什么
- 调用时提供的是实参,函数定义中接收的是形参。
- C++ 普通参数默认按值传递。
- 值传递会得到独立副本,修改形参不会自动修改实参。
- 引用参数可以关联到调用者对象。
- const 引用常用于高效读取较大的对象。
下一篇:return 把什么带回来?
轮到你来试一试
按值传递一个整数,函数只修改自己的形参,原来的整数会自动变吗?
想好了吗?点开看解释
不会。修改的是这次调用里的副本。若要改变调用者的数据,需要明确使用其他方式。