7. 函数基础——编程世界的“模块化拼图”
7.1 为什么需要函数
在生活中,我们做事情常常会把大任务拆分成一个个小任务,这样更容易完成。在编程里也是如此,当程序变得越来越复杂时,如果把所有代码都写在 main
函数里,代码会变得很长、很难理解和维护。函数就像是一个个小的“代码模块”,我们可以把完成特定功能的代码封装在函数里,这样代码的结构会更清晰,也方便重复使用。
比如,在一个游戏程序里,可能需要多次计算玩家的得分,我们就可以把计算得分的代码封装成一个函数,每次需要计算得分时,直接调用这个函数就可以了。
7.2 函数的定义和调用
函数的定义 函数的定义一般包括函数名、参数列表、返回值类型和函数体。基本格式如下:
返回值类型 函数名(参数列表) { // 函数体,实现具体功能的代码 return 返回值; // 如果有返回值的话 }
- 返回值类型:指定函数返回的数据类型,比如
int
、double
、void
等。如果函数不返回任何值,返回值类型用void
表示。 - 函数名:给函数起的名字,要遵循变量命名规则,最好能体现函数的功能。
- 参数列表:可以有零个或多个参数,多个参数之间用逗号分隔。参数就像是函数的“输入”,可以把数据传递给函数。
- 函数体:实现函数具体功能的代码块。
- 返回值:如果函数有返回值,使用
return
语句将结果返回。
示例代码:定义一个函数来计算两个整数的和
#include <iostream> using namespace std; // 定义一个函数,计算两个整数的和 int add(int a, int b) { int sum = a + b; return sum; } int main() { int num1 = 3, num2 = 5; // 调用函数 int result = add(num1, num2); cout << "两数之和为: " << result << endl; return 0; }
在这个程序中,定义了一个名为 add
的函数,它接受两个 int
类型的参数 a
和 b
,函数体里计算它们的和并将结果返回。在 main
函数里调用 add
函数,并将返回值存储在 result
变量中,最后输出结果。
7.3 无参数和无返回值的函数
有些函数不需要参数,也不需要返回值,它们只是完成一些特定的操作。
示例代码:定义一个函数来输出欢迎信息
#include <iostream> using namespace std; // 定义一个无参数、无返回值的函数 void welcome() { cout << "欢迎来到编程世界!" << endl; } int main() { // 调用函数 welcome(); return 0; }
在这个程序中,welcome
函数没有参数,返回值类型是 void
,表示不返回任何值。函数体里只是输出一条欢迎信息。在 main
函数里直接调用 welcome
函数即可。
7.4 函数的参数传递
函数的参数传递有两种方式:值传递和引用传递。
值传递 值传递是指在调用函数时,将实参的值复制一份传递给形参。在函数内部对形参的修改不会影响到实参。
示例代码:
#include <iostream> using namespace std; // 定义一个函数,交换两个整数的值(值传递) void swap(int a, int b) { int temp = a; a = b; b = temp; } int main() { int num1 = 3, num2 = 5; cout << "交换前: num1 = " << num1 << ", num2 = " << num2 << endl; swap(num1, num2); cout << "交换后: num1 = " << num1 << ", num2 = " << num2 << endl; return 0; }
在这个程序中,swap
函数使用值传递,在函数内部交换了 a
和 b
的值,但这并不会影响到 main
函数里的 num1
和 num2
的值。
引用传递 引用传递是指在调用函数时,将实参的引用(相当于实参的别名)传递给形参。在函数内部对形参的修改会直接影响到实参。
示例代码:
#include <iostream> using namespace std; // 定义一个函数,交换两个整数的值(引用传递) void swap(int& a, int& b) { int temp = a; a = b; b = temp; } int main() { int num1 = 3, num2 = 5; cout << "交换前: num1 = " << num1 << ", num2 = " << num2 << endl; swap(num1, num2); cout << "交换后: num1 = " << num1 << ", num2 = " << num2 << endl; return 0; }
在这个程序中,swap
函数使用引用传递,在函数内部交换了 a
和 b
的值,由于 a
和 b
是 num1
和 num2
的引用,所以 num1
和 num2
的值也会被交换。
7.5 函数的声明和定义分离
在大型程序中,为了提高代码的可读性和可维护性,通常会把函数的声明和定义分离。函数声明只需要指定函数名、参数列表和返回值类型,而函数定义则包含具体的函数体。
示例代码:
#include <iostream> using namespace std; // 函数声明 int multiply(int a, int b); int main() { int num1 = 4, num2 = 6; int result = multiply(num1, num2); cout << "两数之积为: " << result << endl; return 0; } // 函数定义 int multiply(int a, int b) { return a * b; }
在这个程序中,先在 main
函数之前进行了 multiply
函数的声明,然后在 main
函数里调用该函数,最后在 main
函数之后进行了函数的定义。
7.6 课后小练习
- 编写一个函数,计算一个整数的阶乘,并在
main
函数里调用该函数。 - 编写一个函数,判断一个整数是否为素数(质数),并在
main
函数里调用该函数进行测试。
通过这部分的学习,你已经掌握了函数的基础知识,函数可以让你的代码更加模块化、可复用,为编写更复杂的程序打下了坚实的基础。