函数的定义和使用

一、函数的概念

main 就是一个函数,它是 C++ 的主函数。一个 C++ 程序由一个主函数和若干子函数构成。程序从主函数开始执行,由主函数调用子函数,子函数还可以再调用其他子函数。一个函数既可以调用其他函数,又可以被其他函数调用。

二、函数的定义

语法形式
类型说明符 函数名(含类型说明的形式参数表)
{
    语句序列
}
形式参数(简称形参)

形式参数表的一般形式:

type1 name1, type2 name2, ... , typen namen
  • type1, type2, … , typen 是类型标识符,表示各形参的类型。
  • name1, name2, … , namen 是形参名。
  • 形参的主要作用是实现主函数和被调函数之间的联系。
  • 形参可以为空,表示该函数不接受任何参数。

三、函数的组成部分

组成部分说明
类型说明符函数的返回值类型。如果函数不返回值,使用 void
函数名标识符,遵循变量命名规则,建议使用有意义的名称
形式参数表用逗号分隔的参数列表,每个参数包含类型和名称。可以为空
语句序列函数体,用大括号 {} 括起来,包含具体的执行代码

四、代码示例

以下代码演示了函数的定义和调用:

#include <iostream>
using namespace std;

// 示例1:无参数、无返回值的函数
void printHello()
{
    cout << "Hello, World!" << endl;
}

// 示例2:有参数、无返回值的函数
void printSum(int a, int b)
{
    cout << a << " + " << b << " = " << a + b << endl;
}

// 示例3:有参数、有返回值的函数
int add(int x, int y)
{
    return x + y;
}

// 示例4:多个形参的函数
double calculateArea(double length, double width)
{
    return length * width;
}

// 示例5:形参为空的等价写法
int getValue(void)
{
    return 100;
}

// 示例6:函数可以调用其他函数
void printResult(int a, int b)
{
    int sum = add(a, b);   // 调用 add 函数
    cout << "结果是:" << sum << endl;
}

// 示例7:求最大值
int max(int a, int b)
{
    if (a > b)
        return a;
    else
        return b;
}

// 示例8:判断素数
bool isPrime(int n)
{
    if (n < 2)
        return false;
    for (int i = 2; i * i <= n; i++)
    {
        if (n % i == 0)
            return false;
    }
    return true;
}

int main()
{
    // 调用无参数函数
    printHello();

    // 调用有参数函数
    printSum(3, 5);

    // 调用有返回值的函数
    int result = add(10, 20);
    cout << "add(10, 20) = " << result << endl;

    // 调用计算面积函数
    double area = calculateArea(5.5, 3.2);
    cout << "面积 = " << area << endl;

    // 调用形参为空的函数
    int v = getValue();
    cout << "getValue() = " << v << endl;

    // 函数调用其他函数
    printResult(7, 8);

    // 调用求最大值函数
    cout << "max(15, 9) = " << max(15, 9) << endl;

    // 调用判断素数函数
    int num = 17;
    if (isPrime(num))
        cout << num << " 是素数" << endl;
    else
        cout << num << " 不是素数" << endl;

    return 0;
}Code language: PHP (php)

五、注意事项

  • 函数必须先声明或定义,然后才能被调用。如果函数在 main 之后定义,需要在 main 之前提供函数声明(原型)。
  • 函数的返回值类型必须与 return 语句返回的表达式类型一致。如果函数声明为 void,则不能使用带值的 return,但可以使用 return; 提前结束函数。
  • 形参是函数内部的局部变量,函数调用时由实参初始化。形参的改变不会影响实参(值传递)。
  • 形参名可以与全局变量或其他函数中的形参同名,因为它们作用域不同。
  • 函数体内部可以定义局部变量,其作用域从定义处到函数体结束。
  • 函数不能嵌套定义(即在一个函数内部定义另一个函数),但可以嵌套调用。

六、函数声明(函数原型)

如果函数定义在调用点之后,需要在调用前提供函数声明:

int add(int x, int y);   // 函数声明(函数原型)

int main()
{
    int r = add(1, 2);   // 调用
    return 0;
}

int add(int x, int y)   // 函数定义
{
    return x + y;
}Code language: JavaScript (javascript)

函数声明可以省略形参名,只保留类型:

int add(int, int);

但建议保留形参名,提高可读性。

七、常见错误

1. 函数未声明就调用
int main()
{
    foo();   // 错误:foo 未声明
    return 0;
}

void foo()
{
    cout << "hello" << endl;
}Code language: JavaScript (javascript)

解决:在 main 之前添加声明 void foo();。

2. 返回值类型与 return 不匹配
int func()
{
    return "hello";   // 错误:返回类型不匹配
}Code language: JavaScript (javascript)
3. void 函数使用 return 带值
void func()
{
    return 0;   // 错误:void 函数不能返回值
}Code language: JavaScript (javascript)
4. 形参和实参类型不匹配
void print(int x) { ... }
print(3.14);   // 3.14 被截断为 3,可能丢失精度Code language: PHP (php)

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注