7. 函数基础——编程世界的“模块化拼图”

7.1 为什么需要函数

在生活中,我们做事情常常会把大任务拆分成一个个小任务,这样更容易完成。在编程里也是如此,当程序变得越来越复杂时,如果把所有代码都写在 main 函数里,代码会变得很长、很难理解和维护。函数就像是一个个小的“代码模块”,我们可以把完成特定功能的代码封装在函数里,这样代码的结构会更清晰,也方便重复使用。

比如,在一个游戏程序里,可能需要多次计算玩家的得分,我们就可以把计算得分的代码封装成一个函数,每次需要计算得分时,直接调用这个函数就可以了。

7.2 函数的定义和调用

函数的定义 函数的定义一般包括函数名、参数列表、返回值类型和函数体。基本格式如下:

返回值类型 函数名(参数列表) {
    // 函数体,实现具体功能的代码
    return 返回值;  // 如果有返回值的话
}
  • 返回值类型:指定函数返回的数据类型,比如 intdoublevoid 等。如果函数不返回任何值,返回值类型用 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 类型的参数 ab,函数体里计算它们的和并将结果返回。在 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 函数使用值传递,在函数内部交换了 ab 的值,但这并不会影响到 main 函数里的 num1num2 的值。

引用传递 引用传递是指在调用函数时,将实参的引用(相当于实参的别名)传递给形参。在函数内部对形参的修改会直接影响到实参。

示例代码

#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 函数使用引用传递,在函数内部交换了 ab 的值,由于 abnum1num2 的引用,所以 num1num2 的值也会被交换。

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 课后小练习

  1. 编写一个函数,计算一个整数的阶乘,并在 main 函数里调用该函数。
  2. 编写一个函数,判断一个整数是否为素数(质数),并在 main 函数里调用该函数进行测试。

通过这部分的学习,你已经掌握了函数的基础知识,函数可以让你的代码更加模块化、可复用,为编写更复杂的程序打下了坚实的基础。

类似文章

发表回复