一、前言
重复代码抽取封装为函数,实现代码复用、结构分层。本篇讲解函数定义、参数传递、返回值、函数重载、全局 / 局部作用域,最后用递归实现阶乘、斐波那契数列案例。
二、函数基础结构
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;
}
重载区分依据:参数数量、参数类型,仅返回值不同无法构成重载。
六、变量作用域:局部变量、全局变量
局部变量:定义在函数 / 代码块内部,仅当前大括号内可用,执行完自动销毁
全局变量:定义在所有函数外部,整个程序全部函数均可访问,慎用
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:计算 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);
}
八、新手避坑
void 函数写 return 数值,编译报错;void 仅可写
return;无返回值函数调用实参类型、数量不匹配,编译失败
无声明直接调用下方函数,报未定义标识符
递归忘记写终止条件,栈溢出程序崩溃
全局变量大量使用会造成数据污染,优先使用局部变量
九、综合实战:封装计算器加减乘除函数
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++ 指针基础、地址取值、指针与数组关系详解