C++ 编程语法
函数是将特定功能的代码打包封装、起名复用的机制。好的函数让程序结构清晰,有效避免重复代码。本章还将介绍递归这一强大技术。
8.1
函数是对实现某一功能的代码进行模块化封装。定义格式如下:
| 组成部分 | 说明 | 是否必须 |
|---|---|---|
| 返回值类型 | 函数执行完毕后返回的数据类型,如 int、double、string 等 | ✅ 必需(无返回值写 void) |
| 函数名 | 调用函数时使用的名字,命名规则同变量名 | ✅ 必需 |
| 参数列表 | 调用时传入的数据,需指定类型和名称,多个参数用逗号分隔 | 可选(无参数时留空) |
| 函数体 | 花括号 {} 内要执行的具体代码 | ✅ 必需 |
| return 语句 | 返回计算结果并结束函数;返回值类型为 void 时可省略 | 视返回类型而定 |
| 1 | // 示例1:计算两数之和(有返回值) |
| 2 | int Add(int a, int b) // 返回类型 int,两个 int 参数 |
| 3 | { |
| 4 | int result = a + b; |
| 5 | return result; // 返回计算结果 |
| 6 | } |
| 7 | |
| 8 | // 示例2:打印问候语(无返回值) |
| 9 | void Greet(string name) // 返回类型 void,表示不返回值 |
| 10 | { |
| 11 | cout << "Hello, " << name << "!" << endl; |
| 12 | // 无需 return |
| 13 | } |
Add、GetMax、PrintResult)。多个参数即使类型相同也不能省略类型声明,必须写 int a, int b,不能写 int a, b。8.2
调用函数就是使用函数的功能来执行代码或获取返回值。在函数名后跟圆括号,括号内传入实参,多个参数用逗号分隔。
| 1 | int Add(int a, int b) // a、b 是形参(定义处) |
| 2 | { return a + b; } |
| 3 | |
| 4 | int main() |
| 5 | { |
| 6 | int x = 3, y = 5; |
| 7 | int sum = Add(x, y); // x、y 是实参(变量) |
| 8 | Add(10, 20); // 10、20 也是实参(字面量) |
| 9 | return 0; |
| 10 | } |
8.3
C++ 要求函数必须先定义(或声明)后调用。如果函数定义在 main() 之后,需要在前面写函数声明(也叫函数原型),提前告诉编译器这个函数的存在。
| 概念 | 格式 | 作用 |
|---|---|---|
| 函数声明(原型) | 返回类型 函数名(参数列表); | 告诉编译器函数"长什么样",没有具体实现代码 |
| 函数定义(实现) | 返回类型 函数名(参数列表) { 函数体 } | 给出函数的完整实现代码 |
| 1 | #include <iostream> |
| 2 | using namespace std; |
| 3 | |
| 4 | int Add(int a, int b); // ← 函数声明(只写函数头,不写函数体) |
| 5 | // 参数名可省略:int Add(int, int); |
| 6 | |
| 7 | int main() |
| 8 | { |
| 9 | cout << Add(3, 5) << endl; // 正常调用 |
| 10 | return 0; |
| 11 | } |
| 12 | |
| 13 | int Add(int a, int b) // ← 函数定义(在 main 之后也没问题) |
| 14 | { |
| 15 | return a + b; |
| 16 | } |
8.4
C++ 中函数参数的传递方式主要有两种:值传递和引用传递,区别在于函数内修改参数是否影响原变量。
int x& 符号 int &x| 1 | // 值传递:修改的是副本 |
| 2 | void TryChange(int x) // x 是副本 |
| 3 | { x = 100; } // 只改了副本,原变量不变 |
| 4 | |
| 5 | // 引用传递:直接修改原变量 |
| 6 | void RealChange(int &x) // & 表示引用,x 就是原变量 |
| 7 | { x = 100; } // 修改原变量本身 |
| 8 | |
| 9 | int main() |
| 10 | { |
| 11 | int a = 5; |
| 12 | TryChange(a); |
| 13 | cout << a; // 输出:5(未改变) |
| 14 | RealChange(a); |
| 15 | cout << a; // 输出:100(已改变) |
| 16 | return 0; |
| 17 | } |
| 使用场景 | 推荐方式 |
|---|---|
| 只需要读取参数的值,不修改 | 值传递,或 const 引用 避免大对象的拷贝开销 |
| 需要在函数内修改原变量 | 引用传递 int &x |
参数是大型结构体或 string | const 引用传递 const string &s,避免拷贝开销 |
8.5
递归是函数调用自身的技术。一个正确的递归函数必须具备两个要素:
| 1 | // 计算 n!(n 的阶乘) |
| 2 | int Factorial(int n) |
| 3 | { |
| 4 | if (n == 1) return 1; // ① 边界:1! = 1 |
| 5 | return n * Factorial(n - 1); // ② 推进:n! = n × (n-1)! |
| 6 | } |
| 7 | |
| 8 | // 计算 1+2+...+n |
| 9 | int Sum(int n) |
| 10 | { |
| 11 | if (n == 1) return 1; // ① 边界 |
| 12 | return n + Sum(n - 1); // ② 推进:Sum(n) = n + Sum(n-1) |
| 13 | } |
| 14 | |
| 15 | cout << Factorial(5); // 120 |
| 16 | cout << Sum(10); // 55 |