用户_29571846
发布于 2026-06-22 / 1 阅读
0
0

C++ 函数完整教程:定义、形参实参、函数重载、作用域、递归入门

一、前言

重复代码抽取封装为函数,实现代码复用、结构分层。本篇讲解函数定义、参数传递、返回值、函数重载、全局 / 局部作用域,最后用递归实现阶乘、斐波那契数列案例。

二、函数基础结构

1. 完整语法

cpp

运行

返回值类型 函数名(形参列表)
{
    函数体逻辑;
    return 返回值;
}
  • 返回值类型:无返回值写void

  • 形参列表:多个参数逗号分隔,无参数留空或写void

2. 无返回值 void 函数

cpp

运行

#include <iostream>
using namespace std;
// 打印分割线,无返回值
void printLine()
{
    cout << "========================" << endl;
}
int main()
{
    printLine(); // 函数调用
    cout << "学生成绩系统" << endl;
    printLine();
    return 0;
}

3. 带参数、带返回值函数

cpp

运行

// 计算两数之和,int为返回类型
int add(int a, int b)
{
    return a + b;
}
int main()
{
    int res = add(10, 20);
    cout << "相加结果:" << res;
    return 0;
}

三、形参与实参、值传递

  • 形参:函数定义括号内变量(仅函数内生效)

  • 实参:调用函数时传入的真实数据

  • 值传递:传递变量副本,函数内部修改不会影响外部原变量

cpp

运行

void changeNum(int x)
{
    x = 999;
}
int main()
{
    int num = 10;
    changeNum(num);
    cout << num; // 输出10,原变量未改变
    return 0;
}

四、函数声明(提前调用前置定义)

若函数写在 main 函数下方,需要在 main 前声明函数原型,否则编译报错

cpp

运行

#include <iostream>
using namespace std;
// 函数声明
int mul(int a, int b);

int main()
{
    cout << mul(3,4);
    return 0;
}
// 函数实现写在后面
int mul(int a, int b)
{
    return a * b;
}

五、函数重载(同名多参数函数)

同一个函数名,参数个数 / 类型不同,编译器自动匹配对应函数

cpp

运行

#include <iostream>
using namespace std;
// 两个int相加
int calc(int a, int b)
{
    return a + b;
}
// 三个int相加
int calc(int a, int b, int c)
{
    return a + b + c;
}
// 浮点数相加
double calc(double a, double b)
{
    return a + b;
}
int main()
{
    cout << calc(1,2) << endl;
    cout << calc(1,2,3) << endl;
    cout << calc(1.5, 2.5) << endl;
    return 0;
}

重载区分依据:参数数量、参数类型,仅返回值不同无法构成重载。

六、变量作用域:局部变量、全局变量

  1. 局部变量:定义在函数 / 代码块内部,仅当前大括号内可用,执行完自动销毁

  2. 全局变量:定义在所有函数外部,整个程序全部函数均可访问,慎用

cpp

运行

#include <iostream>
using namespace std;
int globalNum = 100; // 全局变量
void test()
{
    int localNum = 20; // 局部变量
    cout << globalNum << " " << localNum;
}
int main()
{
    test();
    // cout << localNum; 报错,局部变量main无法访问
    return 0;
}

七、递归函数(函数调用自身)

核心条件

  1. 递归出口(终止条件,避免无限递归)

  2. 递归递进逻辑,逐步逼近出口

案例 1:计算 n 的阶乘

cpp

运行

int factorial(int n)
{
    // 递归出口
    if(n == 0 || n == 1)
        return 1;
    // 递归调用自身
    return n * factorial(n - 1);
}
int main()
{
    cout << factorial(5); // 5! = 120
    return 0;
}

案例 2:斐波那契数列

cpp

运行

int fib(int n)
{
    if(n <= 2) return 1;
    return fib(n-1) + fib(n-2);
}

八、新手避坑

  1. void 函数写 return 数值,编译报错;void 仅可写return;无返回值

  2. 函数调用实参类型、数量不匹配,编译失败

  3. 无声明直接调用下方函数,报未定义标识符

  4. 递归忘记写终止条件,栈溢出程序崩溃

  5. 全局变量大量使用会造成数据污染,优先使用局部变量

九、综合实战:封装计算器加减乘除函数

cpp

运行

#include <iostream>
using namespace std;

double add(double a, double b) { return a + b; }
double sub(double a, double b) { return a - b; }
double mul(double a, double b) { return a * b; }
double div(double a, double b)
{
    if(b == 0)
    {
        cout << "除数不能为0" << endl;
        return 0;
    }
    return a / b;
}

int main()
{
    double x, y;
    char op;
    cout << "输入计算式:";
    cin >> x >> op >> y;
    double res;
    switch(op)
    {
        case '+': res = add(x,y); break;
        case '-': res = sub(x,y); break;
        case '*': res = mul(x,y); break;
        case '/': res = div(x,y); break;
        default: cout << "运算符错误"; return 1;
    }
    cout << "结果:" << res;
    return 0;
}

十、下期预告

下一篇:C++ 指针基础、地址取值、指针与数组关系详解


评论