C++启蒙课程:第7章 函数——C++的编程模块
我们将掌握编程的“模块化构建术”——函数!它能帮我们把复杂的任务分解成一个个清晰、易于管理的小模块。
函数工厂:定义与原型
学习“任务分队”`void`和`return`,以及“数据快递员”按值传递。
数组特工队:指针与const
掌握“数据阵列的指挥官”如何传递地址,并用`const`封条保护数据。
高级魔法:递归与指针
探索“无限嵌套的镜像”`递归`和“地址传递的信使”`函数指针`。
课时一:函数工厂:定义与原型
(覆盖知识点 7.1.1 - 7.2.2)
7.1.1 “任务分队” (定义)
`void` 分队只执行任务(如打印)。有返回值 (如 `double`) 的分队会返回一个“结果包裹”。
7.1.2 “ID卡” (原型)
C++中,你必须在 `main` 函数“之前”提交函数的“ID卡”(原型),否则编译器不认识它。
7.2 “数据快递员” (按值传递)
C++默认“按值传递”。快递员把你的数据“复印”一份,函数在“副本”上操作,你的“原件”安然无恙。
💡 互动体验:
📜 代码支撑:
课时二:数组特工队:指针与const保护
(覆盖知识点 7.3.1 - 7.4)
7.3.1 “数据阵列的指挥官”
传递数组时,传递的是“地址”(指挥官)。函数拿到地址后,可以直接修改**原始数组**。
7.3.5 “const 只读封条”
如果不希望函数修改数组,请贴上 `const` 封条。`const` 保护原始数据不被意外更改。
7.3.3 数组区间
一种更灵活的方式是传递两个指针:一个指向“起始”,一个指向“结尾之后”。
7.4 二维数组
传递二维数组时,C++要求你必须指定“列数”(除了第一维之外的所有维度)。
课时三:灵活的特派员:字符串与结构
(覆盖知识点 7.5.1 - 7.8)
7.5.1 C-风格字符串与 👻
传递 C-字符串 (`char*`) 时,函数不知道它的长度。它只能一直读,直到撞见“空值幽灵” `\0`。
7.6 “结构包裹”
结构 `struct` 像基本类型一样,可以被“按值传递”(复制)和“返回”。
课时四:高级魔法:递归与函数指针
(覆盖知识点 7.9.1 - 7.10.4)
7.9 “无限嵌套的镜像” (递归)
递归是函数调用“自己”。它必须有一个“基线条件”来停止,否则将无限嵌套!
7.10 “地址传递的信使”
函数指针是一个“信使”,你告诉它要去哪个函数(地址),它就能帮你调用那个函数。
编程实践与作业 (7.13)
是时候检验你作为“模块化构建师”的实力了!
练习 1:温度转换 (7.13 练习 5)
任务:
编写一个有返回值的函数 `ctof`,接受一个 `double` 类型的摄氏温度值,返回一个 `double` 类型的华氏温度值。
点击查看参考答案
练习 2:const 保护的数组平均值 (7.13 练习 5 简化)
任务:
编写一个函数 `average`,计算 `double` 数组的平均值。函数必须使用 `const` 保护数组不被修改。
点击查看参考答案
练习 3:C-字符串字符计数 (7.13 练习 8 简化)
任务:
编写一个函数 `count_char`,接受一个 C-风格字符串 (const char *) 和一个 `char`,统计该字符在字符串中出现的次数。
点击查看参考答案
练习 4:函数指针 (7.13 练习 11)
任务:
编写一个函数 `judge()`,它接受另一个函数的地址作为参数。该被调用函数接受 const char* 参数并返回 `int` 值 (例如,计算字符串长度)。
点击查看参考答案
本章知识点总结与复习
| 核心概念 | 解释/功能 | 关键用法/示例 |
|---|---|---|
| 函数定义/原型 | 原型描述接口,C++中必不可少。 | int func(int x); |
| 按值传递 | 传递参数的副本,保护原始数据。 | func(val); |
| 函数与数组 | 传递数组名即传递**指针/地址**。 | void func(int arr[], int n); |
| `const`参数 | 保护原始数据不被函数修改。 | void func(const int * arr); |
| C-字符串 | 传递 `char *` 地址,通过 `\0` 识别结尾。 | int count(const char * str); |
| 函数与结构 | 可按值传递、返回。大结构应传递地址。 | Boss func(Boss b); |
| 递归 | 函数调用自身,必须有终止条件。 | void f(int n) { f(n-1); } |
| 函数指针 | 存储函数地址的变量,可作为参数传递。 | double (*pf)(int); |