女孩和机器人一起思考

一起动脑筋 · 先看一个小故事

女孩交给机器人两张数卡 3 和 5,请它求和。函数怎样拿到这两张卡?

把过程摊开来看

沿着编号看一遍,再用自己的话讲一遍
  1. 调用处提供 3 和 5
  2. 函数入口形参接收值
  3. 计算3 加 5
  4. 返回结果 8

参数把调用处的数据带入函数。

按值传递时,形参获得值的副本。可以想成抄到函数自己的任务纸上,再用这些数计算。

01什么是参数?

函数常需要外部提供数据:

int add(int a, int b) {
    return a + b;
}

ab 是这个函数的参数。

02形参和实参有什么区别?

int result = add(3, 5);

实参(argument)

调用时提供的 35

形参(parameter)

函数定义里的 ab

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 把什么带回来?

轮到你来试一试

按值传递一个整数,函数只修改自己的形参,原来的整数会自动变吗?

想好了吗?点开看解释

不会。修改的是这次调用里的副本。若要改变调用者的数据,需要明确使用其他方式。