2-6 函数为何有用,以及如何有效使用它们
既然我们已经介绍了函数是什么以及它们的一些基本功能,现在让我们更深入地探讨它们为何如此有用。
为何要使用函数?
新手程序员常问:“难道不能把所有代码都放在main函数里吗?”对于简单程序,这当然可行。但函数能带来诸多优势,使其在非简单长度或复杂度的程序中极具价值。
-
组织性——随着程序复杂度提升,将所有代码塞进main()函数会变得越来越棘手。函数如同独立于主程序的小型程序,编写时无需顾虑程序其他部分。这让我们能将复杂程序拆解为更小、更易管理的模块,从而降低整体复杂度。
-
可复用性——函数编写完成后可在程序中多次调用,既避免了代码重复(遵循“不要重复自己”原则),又最大限度降低了复制粘贴错误的概率。函数还能共享至其他程序,减少每次从零编写(及重新测试)的代码量。
-
测试——函数减少了代码冗余,从根本上降低了测试工作量。由于函数具有自包含特性,一旦通过测试验证其功能正常,除非修改函数本身,否则无需重复测试。这减少了每次需要测试的代码量,使发现错误(或从源头避免错误)变得更容易。
-
可扩展性——当需要扩展程序处理新场景时,函数允许我们在单一位置进行修改,该变更将自动应用于每次函数调用。
-
抽象性——调用函数时,只需知晓其名称、输入参数、输出结果及所在位置。无需理解其工作原理或依赖关系。这降低了使用他人代码(包括标准库中所有内容)所需的知识门槛。
有效使用函数
新手程序员面临的最大挑战之一(除学习语言本身外)是理解何时以及如何有效使用函数。以下是编写函数的几条基本准则:
- 程序中重复出现的语句组通常应封装为函数。例如,若需多次以相同方式读取用户输入,这便是函数的绝佳应用场景。若在多处以相同方式输出内容,同样适合封装为函数。
- 具有明确输入输出关系的代码(尤其复杂逻辑)是函数的理想载体。例如对待排序的元素列表,排序代码即使仅执行一次也值得封装为函数。输入是未排序的列表,输出是排序后的列表。另一个理想的函数候选是模拟六面骰子掷出的代码。当前程序可能仅在单处使用它,但若将其封装为函数,后续扩展程序或新项目中便可复用。
- 函数通常应只执行一项(且仅一项)任务。
- 当函数变得过长、过于复杂或难以理解时,可将其拆分为多个子函数。这称为重构
refactoring。我们在第3.10课---在问题显现前发现隐患 中将深入探讨重构。
学习C++时,你常会编写包含三个子任务的程序:
- 从用户读取输入
- 根据输入计算值
- 输出计算结果
对于简单程序(例如少于20行代码),这些任务可全部或部分放在main函数中实现。但对于较长程序(或单纯为练习),每个子任务都适合拆分为独立函数。
新手程序员常将计算值与输出结果合并到单个函数中,这违反了函数的“单一职责”原则。计算值的函数应将结果返回给调用方,由调用方决定后续处理(如调用其他函数输出结果)。

浙公网安备 33010602011771号