C++ 中的函数是执行特定任务的自包含代码块,用于组织代码、简化重复任务和提高代码的可维护性。函数的定义、调用、参数传递、返回值等方面构成了 C++ 函数的基础。下面我们会全面讲解 C++ 函数的概念、类型、参数传递方式、递归、函数重载、内联函数、模板函数等多个方面。
1. 函数的定义和调用
1.1 函数定义
C++ 中函数的定义一般包括以下几部分:
- 返回类型:函数执行完成后返回的数据类型。
- 函数名:标识函数的名称,用于函数的调用。
- 参数列表:传递给函数的参数,写在圆括号内。如果没有参数,参数列表为空。
- 函数体:函数的代码块,定义函数执行的操作。
格式如下:
示例:
1.2 函数声明
函数声明(也称为函数原型)用于告知编译器函数的存在,声明时不需要函数体,只需要函数的返回类型、函数名、参数类型。
2. 函数的参数
C++函数可以接收输入参数并返回值。
2.1 参数传递方式
C++ 支持三种参数传递方式:
- 按值传递(Pass by Value)
- 按引用传递(Pass by Reference)
- 按指针传递(Pass by Pointer)
接下来依次进行讲解
2.1.1 按值传递
按值传递是将参数的副本传递给函数,函数内部对参数的修改不会影响原变量。
如下所示:
cpp
void modify(int a) {
a = 10; // 修改的是副本,不会影响外部的a
}
int main() {
int x = 5;
modify(x);
cout << x << endl; // 输出5
return 0;
}
这里面,相当于是有创建一个变量,将值赋给这个新的变量,原变量不会有任何修改。
2.1.2 按引用传递
按引用传递将变量本身的引用传递给函数,函数内部的修改会直接影响原变量。
cpp
void modify(int& a) {
a = 10; // 修改引用,直接影响外部变量
}
int main() {
int x = 5;
modify(x);
cout << x << endl; // 输出10
return 0;
}
2.1.3 按指针传递
cpp
void modify(int* a) {
*a = 10; // 使用指针修改外部变量的值
}
int main() {
int x = 5;
modify(&x); // 传递x的地址
cout << x << endl; // 输出10
return 0;
}
2.2 默认参数
函数可以为参数提供默认值,调用时可以省略这些参数。
cpp
int add(int a, int b = 5) { // b 的默认值为5
return a + b;
}
int main() {
cout << add(10) << endl; // 输出15,b 使用默认值
cout << add(10, 20) << endl; // 输出30,b 被覆盖
return 0;
}
⭐注意:默认赋值从右向左开始,顺序不能错,并且中间不能中断。
3. 函数的返回值
函数的返回值是函数执行后的结果。返回值的类型必须与函数定义中的返回类型一致。如果函数不需要返回值,返回类型可以是 void
。
cpp
void display() { // 没有返回值的函数
cout << "Hello, World!" << endl;
}
3.1 多种返回类型
C++ 支持返回基础数据类型、引用、指针甚至对象等多种类型。
cpp
int add(int a, int b) {
return a + b; // 返回值为整数
}
上面只给出了一个例子,其余的和这个类似,不在赘述。
3.1.2 返回引用
函数可以返回引用,用于操作函数外部的数据。
cpp
int& modify(int& a) {
a = 10;
return a;
}
4. 函数重载(Function Overloading)
函数重载指的是在同一作用域内定义多个同名函数 ,但这些函数的参数列表必须不同 。编译器根据参数的类型和数量决定调用哪个函数。
cpp
int add(int a, int b) {
return a + b;
}
double add(double a, double b) {
return a + b;
}
int main() {
cout << add(5, 3) << endl; // 调用 int 版本
cout << add(2.5, 3.1) << endl; // 调用 double 版本
return 0;
}
5. 内联函数(inline function)
内联函数是一种优化方式,使用 inline
关键字定义内联函数,提示编译器在调用该函数时,将其函数体直接嵌入到调用处。这样可以避免函数调用的开销,但内联函数仅适用于较短的、频繁调用的函数。
cpp
inline int square(int x) {
return x * x;
}
int main() {
cout << square(5) << endl; // 输出25
return 0;
}
6. 递归函数
递归函数是指函数调用自身,通常用于解决具有递归性质的问题,如阶乘、斐波那契数列等。
cpp
int factorial(int n) {
if (n == 0 || n == 1)
return 1;
else
return n * factorial(n - 1);
}
int main() {
cout << factorial(5) << endl; // 输出120
return 0;
}
7. 函数指针
函数指针是一种特殊的指针类型,它指向函数,可以用于动态调用不同的函数。
cpp
int add(int a, int b) {
return a + b;
}
int main() {
int (*funcPtr)(int, int) = add; // 定义函数指针并指向add函数
cout << funcPtr(5, 3) << endl; // 通过指针调用函数
return 0;
}
8. 模板函数
模板函数用于定义与类型无关的通用函数,可以处理不同类型的参数,而不需要为每种类型重写函数。
cpp
template <typename T>
T add(T a, T b) {
return a + b;
}
int main() {
cout << add(5, 3) << endl; // 输出8 (int)
cout << add(2.5, 3.1) << endl; // 输出5.6 (double)
return 0;
}
9. Lambda表达式
Lambda 表达式是 C++11 引入的一种简写形式,用于定义匿名函数。
cpp
auto add = [](int a, int b) { return a + b; };
int main() {
cout << add(5, 3) << endl; // 输出8
return 0;
}
10. 总结
C++ 的函数系统非常灵活且功能强大,它支持函数重载、默认参数、模板、递归、内联函数、Lambda 表达式等丰富的功能,可以帮助开发者更有效地组织和优化代码。