← 目录 / 第八章 · 函数 / 8.1 函数基础

8.1 函数基础:定义、调用与声明

函数是将特定功能的代码打包封装、起名复用的机制。好的函数让程序结构清晰,有效避免重复代码。本节先搞清楚函数是怎么"写出来"、怎么"用起来"的。

函数的定义

函数是对实现某一功能的代码进行模块化封装。定义格式如下:

int   Add ( int a, int b { return a + b; }
返回值类型 — 函数返回什么类型的数据
函数名 — 调用时使用的名字
参数列表 — 传入的数据(类型 + 名称)
函数体 — 具体执行的代码
组成部分说明是否必须
返回值类型函数执行完毕后返回的数据类型,如 intdoublestring✅ 必需(无返回值写 void
函数名调用函数时使用的名字,命名规则同变量名✅ 必需
参数列表调用时传入的数据,需指定类型和名称,多个参数用逗号分隔可选(无参数时留空)
函数体花括号 {} 内要执行的具体代码✅ 必需
return 语句返回计算结果并结束函数;返回值类型为 void 时可省略视返回类型而定
C++ · 函数定义示例
1// 示例1:计算两数之和(有返回值)
2int Add(int a, int b) // 返回类型 int,两个 int 参数
3{
4 int result = a + b;
5 return result; // 返回计算结果
6}
7
8// 示例2:打印问候语(无返回值)
9void Greet(string name) // 返回类型 void,表示不返回值
10{
11 cout << "Hello, " << name << "!" << endl;
12 // 无需 return
13}
💡
命名建议:函数名应见名知义,用动词或动词短语描述其功能(如 AddGetMaxPrintResult)。多个参数即使类型相同也不能省略类型声明,必须写 int a, int b,不能写 int a, b

函数的调用

调用函数就是使用函数的功能来执行代码或获取返回值。在函数名后跟圆括号,括号内传入实参,多个参数用逗号分隔。

main() → 调用 → Add(3, 5) → 返回 → 8 // 用变量接收:int sum = Add(3, 5);
main() → 调用 → Add(3, 5) * 2 → 直接用于表达式 → 16
main() → 调用 → Greet("小明") // void 函数:作为独立语句调用

形参与实参

形参形式参数
函数定义时括号内的参数,规定调用者需要传入什么类型的数据。只是一个"占位符",没有实际的值。
实参实际参数
函数调用时实际传入的具体值或变量。实参的数量、顺序、类型必须与形参一一对应。
C++ · 形参 vs 实参
1int Add(int a, int b) // a、b 是形参(定义处)
2{ return a + b; }
3
4int 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}

函数的声明

C++ 要求函数必须先定义(或声明)后调用。如果函数定义在 main() 之后,需要在前面写函数声明(也叫函数原型),提前告诉编译器这个函数的存在。

概念格式作用
函数声明(原型)返回类型 函数名(参数列表);告诉编译器函数"长什么样",没有具体实现代码
函数定义(实现)返回类型 函数名(参数列表) { 函数体 }给出函数的完整实现代码
C++ · 函数声明示例
1#include <iostream>
2using namespace std;
3
4int Add(int a, int b); // ← 函数声明(只写函数头,不写函数体)
5 // 参数名可省略:int Add(int, int);
6
7int main()
8{
9 cout << Add(3, 5) << endl; // 正常调用
10 return 0;
11}
12
13int Add(int a, int b) // ← 函数定义(在 main 之后也没问题)
14{
15 return a + b;
16}
📖
下一节预告:目前我们写的函数,调用时必须严格按照参数列表传值。8.2 节会讲解值传递、引用传递、指针传递的区别,以及"参数可以有默认值"这个更省事的写法。