前言

这一节我们将正式进入函数的相关学习,这一节内容很重要!!!可能会涉及到一些之前所学习的相关知识,如果你还有不明不白的,可以去温习一下之前所学C++基础教程

C++函数

在C++中,函数就像是一个小助手,它负责完成一个特定的任务。你可以把一段代码想象成是一个小助手,当你需要它的时候,就可以召唤它来帮你做事,而不需要每次都从头开始写这段代码。

每个C++程序至少会有一个主函数,也就是main()函数,它是程序的起点。但是,你还可以定义更多的函数来帮助你完成不同的任务。

函数声明就像是给小助手起个名字,告诉计算机它叫什么,能帮你做什么,以及你需要给它什么信息(参数)。函数定义则是真正告诉计算机这个小助手具体应该怎么做。

C++标准库就像是一个有很多小助手的团队,它们已经准备好了,你可以直接召唤它们来帮你做事,比如strcat()可以把两个字符串连在一起,memcpy()可以帮你复制一段内存。

函数还有其他的名字,比如方法、子例程或者程序,它们都是做同样的事情:帮你完成任务。

总结一下,函数就是一段可以重复使用的代码,它负责完成一个特定的任务。你可以通过声明和定义来创建自己的函数,也可以使用C++标准库中已经定义好的函数。这样可以让你的程序更加整洁和高效。

函数的定义

一个函数的基本结构如下:

1
2
3
返回类型 函数名(参数列表) {
// 函数体
}

组成部分:

  • 返回类型(Return Type): 指定函数完成任务后返回的数据类型。如果函数不返回任何值,使用 void
  • 函数名(Function Name): 函数的标识符,用于调用函数。
  • 参数列表(Parameter List): 函数接受的输入,类似占位符。在调用函数时,实际参数的值会传递给这些参数。参数可以有多个,也可以没有。
  • 函数体(Function Body): 包含实现函数功能的代码块。

示例:

1
2
3
4
5
6
7
8
9
// 返回两个数中较大的一个
int max(int num1, int num2) {
int result;
if (num1 > num2)
result = num1;
else
result = num2;
return result;
}

函数声明

函数声明告诉编译器函数的名称和如何调用它,实际的函数体可以在别处定义。

格式:

1
返回类型 函数名(参数列表);

示例:

1
int max(int num1, int num2);

参数名在函数声明中是可选的,只要指定类型即可:

1
int max(int, int);

调用函数

当我们需要使用函数时,通过函数名和参数来调用它。

示例程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
using namespace std;

// 函数声明
int max(int num1, int num2);

int main() {
int a = 100;
int b = 200;
int ret;

// 获取较大的值
ret = max(a, b);

cout << "最大值是:" << ret << endl;

return 0;
}

// 函数定义
int max(int num1, int num2) {
int result;
if (num1 > num2)
result = num1;
else
result = num2;
return result;
}

输出:

1
最大值是:200

函数参数

函数可以通过参数接受输入,有三种传递参数的方式:

  1. 值传递(Pass by Value): 将实际参数的值复制一份传递给函数。函数内对参数的修改不会影响实际参数。
  2. 指针传递(Pass by Pointer): 将实际参数的地址传递给函数。函数可以通过指针修改实际参数的值。
  3. 引用传递(Pass by Reference): 传递参数的引用,函数内对参数的修改会直接影响实际参数。

注意: 默认情况下,C++ 使用值传递。


参数的默认值

函数参数可以有默认值,如果在调用函数时未提供该参数的值,将使用默认值。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
using namespace std;

int sum(int a, int b = 20) {
int result;
result = a + b;
return result;
}

int main() {
int a = 100;
int b = 200;
int result;

// 使用两个参数
result = sum(a, b);
cout << "总和是:" << result << endl;

// 使用一个参数,b 使用默认值
result = sum(a);
cout << "总和是:" << result << endl;

return 0;
}

输出:

1
2
总和是:300
总和是:120

Lambda 函数与表达式

C++11 引入了匿名函数,称为 Lambda 函数或 Lambda 表达式。它们使您可以在代码中定义简短的内联函数。

基本形式:

1
2
3
[capture](参数列表) -> 返回类型 {
// 函数体
}
  • [capture](捕获列表): 指定哪些外部变量可以在 Lambda 中使用。
  • (参数列表): Lambda 接受的参数。
  • 返回类型(可选): 如果编译器无法推断返回类型,可以显式指定。
  • 函数体: Lambda 执行的代码。

示例:

1
2
// 简单的比较函数
auto compare = [](int x, int y) { return x < y; };

无参数的 Lambda:

1
2
// 不接受参数的 Lambda
auto increment = [] { ++global_x; };

指定返回类型的 Lambda:

1
2
3
4
5
// 显式指定返回类型
auto sum = [](int x, int y) -> int {
int z = x + y;
return z + x;
};

捕获列表(Capture List)

Lambda 可以捕获其所在作用域的变量,有多种方式:

  • []: 不捕获任何变量。尝试使用外部变量会导致错误。
  • [x, &y]: 捕获 x 的值,捕获 y 的引用。
  • [&]: 引用捕获所有在 Lambda 中使用的外部变量。
  • [=]: 值捕获所有在 Lambda 中使用的外部变量。
  • [&, x]: 引用捕获除 x 之外的所有变量,x 值捕获。
  • [=, &z]: 值捕获除 z 之外的所有变量,z 引用捕获。

注意使用 this 指针:

  • 对于 [=][&]this 指针会被自动捕获,可直接使用成员变量和函数。

  • 对于 [],如果需要使用 this,必须显式捕获:

    1
    [this]() { this->someFunc(); }();