一、函数的作用
函数 是C++ 代码模块化的基础。
函数有以下作用:
- 提高代码复用性:相同的代码块可多次调用,而不必重复编写。
- 增强程序可读性:将逻辑拆分,使代码结构更清晰。
- 便于调试和维护:修改函数不会影响其他部分,降低错误风险。
二、 函数的基本语法
语法:
返回类型 函数名(参数列表) {
// 函数体
return 返回值; // 如果返回类型是 void,则不需要 return
}
注意:
- 返回类型:函数返回值的数据类型(如
int
、double
、void
)。 - 函数名:标识函数的名称,遵循 C++ 变量命名规则。
- 参数列表:可选,表示函数接收的输入数据(参数类型 + 变量)。
return
语句:返回函数执行的结果(void
类型的函数可以省略)。
三、 函数的声明、定义与调用
函数的完整使用分为声明、定义和调用三部分:
- 函数声明(函数原型):告诉编译器函数的名称、返回类型和参数(位于
main()
之前或头文件)。 - 函数定义:实现函数的具体逻辑。
- 函数调用:执行函数,使用返回值。
示例:求两个数的和
#include <iostream>
using namespace std;
// 1、 函数声明(可选,但如果定义在 main() 之后,则必须声明)
int add(int a, int b);
int main() {
// 3、 函数调用
int result = add(10, 20);
cout << "sum = " << result << endl;
system("pause");
return 0;
}
// 2、 函数定义
int add(int a, int b) {
return a + b;
}
注意:
int add(int a, int b);
是函数声明,也称函数原型,用于提前告诉编译器该函数的存在。add(10, 20);
是函数调用,执行add
函数内容并返回计算结果。return a + b;
返回计算结果。
四、参数传递方式——值传递 vs. 指针传递 vs. 引用传递
(1) 值传递(Pass by Value)
作用:
传递变量的副本,不影响原数据。
示例:
#include <iostream>
using namespace std;
void modify(int x)
{
x = 100; // 仅修改副本,不影响原变量
}
int main() {
int a = 10;
modify(a);
cout << "a = " << a << endl; // 输出 a = 10(未修改)
system("pause");
return 0;
}
(2) 指针传递(Pass by Pointer)
作用:
传递指向变量的指针,可修改数据。
示例:
#include <iostream>
using namespace std;
void modify(int* x)
{
*x = 100; // 通过指针修改值
}
int main() {
int a = 10;
modify(&a);
cout << "a = " << a << endl; // 输出 a = 100(已修改)
system("pause");
return 0;
}
(3) 引用传递(Pass by Reference)
作用:
传递变量的引用,可修改原数据。
示例:
#include <iostream>
using namespace std;
void modify(int& x)
{
x = 100; // 直接修改原变量
}
int main() {
int a = 10;
modify(a);
cout << "a = " << a << endl; // 输出 a = 100(已修改)
system("pause");
return 0;
}
(4) 三种参数传递方式的比较
方式 | 是否修改原值 | 适用场景 |
---|---|---|
值传递 | ❌ | 仅需读取数据,不修改原数据 |
指针传递 | ✅ | 处理动态内存或 nullptr |
引用传递 | ✅ | 需修改数据,避免拷贝开销,不能处理 nullptr |
五、函数的默认参数
函数提供默认参数的规则:
- 参数可以有默认值(参数类型 变量
=
右侧的值)。 - 从右往左提供默认参数(不能跳过)。
示例:
#include <iostream>
using namespace std;
void greet(string name = "Guest") // 默认参数
{
cout << "Hello, " << name << "!" << endl;
}
int main() {
greet(); // 输出:Hello, Guest!
greet("Alice"); // 输出:Hello, Alice!
system("pause");
return 0;
}
六、 函数的重载(Overloading)
重载的规则:
同名函数,但参数类型或个数不同。
示例:
#include <iostream>
using namespace std;
// 重载函数
int add(int a, int b) // int 版本
{
return a + b;
}
double add(double a, double b) // double 版本
{
return a + b;
}
int main() {
cout << add(10, 20) << endl; // 调用 int 版本
cout << add(3.5, 2.5) << endl; // 调用 double 版本
system("pause");
return 0;
}
注意:
- 函数重载,要求必须参数不同(个数或类型)。
- 返回类型不同不算重载。
七、特殊的函数
(1) 递归函数
作用:
函数自己调用自己,用于分治算法(如阶乘、斐波那契)。
示例:
#include <iostream>
using namespace std;
// 计算输入整数的阶乘
int factorial(int n)
{
if (n == 0) // 递归终止条件
return 1;
return n * factorial(n - 1);
}
int main() {
cout << factorial(5) << endl; // 输出 120
system("pause");
return 0;
}
(2) 内联函数(inline
)
作用:
- 减少函数调用开销(适用于小函数)。
- 是给编译器优化的建议,可能不会真正展开。
示例:
#include <iostream>
using namespace std;
// 内联函数,计算输入数的平方
inline int square(int x)
{
return x * x;
}
int main() {
cout << square(5) << endl; // 输出 25
system("pause");
return 0;
}
(3) main()
函数
作用:
main()
函数是 程序的入口,必须返回int
(标准 C++ 要求)。return 0;
表示正常结束,非 0 代表错误代码。
示例:
#include <iostream>
using namespace std;
int main() {
cout << "Hello, C++!" << endl;
return 0; // 结束程序
}
(4) 函数指针
作用:
指向函数的指针,用于回调、动态函数调用。
示例:
#include <iostream>
using namespace std;
void hello()
{
cout << "Hello, C++!" << endl;
}
int main() {
void (*funcPtr)() = hello; // 声明函数指针
funcPtr(); // 通过指针调用函数
system("pause");
return 0;
}