🔷 第六章 函数
📄 一句话概括

函数对外只有两个口:入口是参数(把料送进去)、出口是返回值(把结果接回来)。这一节把两个口讲透——空函数(没进也没出)、形参实参(进的到底是谁)、默认参数与可变参数(进的可以很灵活)、返回值(出的规矩)。

📝 本节和前面几节的关系

6.1 已经能写出函数了,但那些函数的"进出口"都还很简陋。这一节专攻进出口的规矩。用的全是旧零件:参数就是 2.3.2 的变量声明、返回类型就是 2.4 的类型系统、void 你在 2.1.4 见过(main 前面是 int,不交结果的函数就写 void)。

一、函数的两个口

口 名字 方向 数量
入口 参数 调用方 → 函数 0 个、1 个或多个都行
出口 返回值 函数 → 调用方 最多 1 个

一句话记牢:入口可以多,出口只能一个。

这条限制很硬:本章没有办法让一个函数"同时交回两个结果"。真需要时有两个绕法——① 把结果打包成一个东西再交(第 7 章的结构体会讲);② 用"传地址"让函数直接改调用方的变量(第 7 章的指针、第 8 章的引用)。现在先把这个限制记在心里,遇到"我只想返回两个值"时就知道该等哪一章。

二、这一节五篇怎么分工

  1. 6.2.1 空函数——void f():没料进、没货出,纯干活。
  2. 6.2.2 形参与实参——同一个参数的两个身份:定义时叫形参(占位的空盒子),调用时叫实参(真送过去的货)。
  3. 6.2.3 默认参数——调用时可以不填,函数自动用兜底值。
  4. 6.2.4 可变参数——参数的个数都能不固定(printf 就是这么干的)。
  5. 6.2.5 返回值——return 的规矩:类型要匹配、只能带一个、一执行就退出函数。

三、动手 Demo:一次看清"进"和"出"

#include <iostream>
using namespace std;

int add(int a, int b) {              // 两个入口
    return a + b;                    // 一个出口
}

void showResult(int value) {         // 一个入口、没有出口(void)
    cout << "结果是 " << value << endl;
}

int main() {
    int r = add(7, 8);               // 7 和 8 从入口进,15 从出口出来
    showResult(r);                   // r 从入口进,什么都不出来
    return 0;
}

看到什么算成功:输出 结果是 15。

注意 showResult(r); 这一句:它没有返回值,所以不能写 int x = showResult(r);——那相当于"从一台不出货的机器上取货",编译器会直接拦下。这是 void 最实在的一条约束。

30 秒实验:故意加一行 int x = showResult(5);,编译看报错(信息大意是"void 值不能被使用"),然后删掉。看见 void 就不能接货——这个直觉 6.2.1 会再强化一次。

四、常见误区

  1. "参数越多越万能"——参数超过 4~5 个就是信号:要么函数管得太杂,要么该把几个参数打包成一个整体(第 7 章)。
  2. "void 函数里不能出现 return"——return; 是合法的(表示"提前收工"),只有 return 值; 不合法。
  3. "函数可以返回两个结果"——本章不行。两条口只有一条出口,这是设计上的硬边界。
  4. "形参名要和实参名一样"——毫无关系。参数名只在函数体内部使用,调用方根本看不见它。
自测三问(点开对答案) 1. 函数的入口和出口分别叫什么?——入口是参数,出口是返回值。 2. 参数可以有多个,返回值能有几个?——最多一个。 3. `int x = void函数();` 为什么编不过?——`void` 表示没有返回值,没有货可接。

相关笔记