C++学习笔记(十二)——函数

一、函数的作用

函数C++ 代码模块化的基础。
函数有以下作用:

  • 提高代码复用性:相同的代码块可多次调用,而不必重复编写。
  • 增强程序可读性:将逻辑拆分,使代码结构更清晰。
  • 便于调试和维护:修改函数不会影响其他部分,降低错误风险。

二、 函数的基本语法

语法:

返回类型 函数名(参数列表) {
    // 函数体
    return 返回值;  // 如果返回类型是 void,则不需要 return
}

注意:

  • 返回类型:函数返回值的数据类型(如 intdoublevoid)。
  • 函数名:标识函数的名称,遵循 C++ 变量命名规则。
  • 参数列表:可选,表示函数接收的输入数据(参数类型 + 变量)。
  • return 语句:返回函数执行的结果(void 类型的函数可以省略)。

三、 函数的声明、定义与调用

函数的完整使用分为声明、定义和调用三部分:

  • 函数声明(函数原型):告诉编译器函数的名称、返回类型和参数(位于 main() 之前或头文件)。
  • 函数定义:实现函数的具体逻辑
  • 函数调用:执行函数,使用返回值。

示例:求两个数的和

#include <iostream>
using namespace std;

// 1、 函数声明(可选,但如果定义在 main() 之后,则必须声明)
int add(int a, int b);

int main() {
    // 3、 函数调用
    int result = add(10, 20);
    cout << "sum = " << result << endl;

    system("pause");
    return 0;
}

// 2、 函数定义
int add(int a, int b) {
    return a + b;
}

注意:

  • int add(int a, int b);函数声明,也称函数原型,用于提前告诉编译器该函数的存在。
  • add(10, 20);函数调用,执行 add 函数内容并返回计算结果。
  • return a + b; 返回计算结果。

四、参数传递方式——值传递 vs. 指针传递 vs. 引用传递

(1) 值传递(Pass by Value)

作用:
传递变量的副本不影响原数据

示例:

#include <iostream>
using namespace std;

void modify(int x) 
{
    x = 100;  // 仅修改副本,不影响原变量
}

int main() {
    int a = 10;
    modify(a);
    cout << "a = " << a << endl;  // 输出 a = 10(未修改)

    system("pause");
    return 0;
}

(2) 指针传递(Pass by Pointer)

作用:
传递指向变量的指针可修改数据

示例:

#include <iostream>
using namespace std;

void modify(int* x) 
{
    *x = 100;  // 通过指针修改值
}

int main() {
    int a = 10;
    modify(&a);
    cout << "a = " << a << endl;  // 输出 a = 100(已修改)

    system("pause");
    return 0;
}

(3) 引用传递(Pass by Reference)

作用:
传递变量的引用可修改原数据

示例:

#include <iostream>
using namespace std;

void modify(int& x) 
{
    x = 100;  // 直接修改原变量
}

int main() {
    int a = 10;
    modify(a);
    cout << "a = " << a << endl;  // 输出 a = 100(已修改)

    system("pause");
    return 0;
}

(4) 三种参数传递方式的比较

方式是否修改原值适用场景
值传递仅需读取数据,不修改原数据
指针传递处理动态内存或 nullptr
引用传递需修改数据,避免拷贝开销,不能处理 nullptr

五、函数的默认参数

函数提供默认参数的规则:

  • 参数可以有默认值(参数类型 变量= 右侧的值)。
  • 从右往左提供默认参数(不能跳过)。

示例:

#include <iostream>
using namespace std;

void greet(string name = "Guest") // 默认参数
{
    cout << "Hello, " << name << "!" << endl;
}

int main() {
    greet();         // 输出:Hello, Guest!
    greet("Alice");  // 输出:Hello, Alice!

    system("pause");
    return 0;
}

六、 函数的重载(Overloading)

重载的规则:
同名函数,但参数类型或个数不同

示例:

#include <iostream>
using namespace std;

// 重载函数
int add(int a, int b) // int 版本
{ 
    return a + b; 
}

double add(double a, double b) // double 版本
{ 
    return a + b; 
}

int main() {
    cout << add(10, 20) << endl;      // 调用 int 版本
    cout << add(3.5, 2.5) << endl;    // 调用 double 版本

    system("pause");
    return 0;
}

注意

  • 函数重载,要求必须参数不同(个数或类型)。
  • 返回类型不同不算重载

七、特殊的函数

(1) 递归函数

作用:
函数自己调用自己,用于分治算法(如阶乘、斐波那契)。

示例:

#include <iostream>
using namespace std;

// 计算输入整数的阶乘
int factorial(int n)
{
    if (n == 0) // 递归终止条件
        return 1;
    return n * factorial(n - 1);
}

int main() {
    cout << factorial(5) << endl;  // 输出 120

    system("pause");
    return 0;
}

(2) 内联函数(inline

作用:

  • 减少函数调用开销(适用于小函数)。
  • 是给编译器优化的建议可能不会真正展开

示例:

#include <iostream>
using namespace std;

// 内联函数,计算输入数的平方
inline int square(int x)
{ 
    return x * x; 
}

int main() {
    cout << square(5) << endl;  // 输出 25

    system("pause");
    return 0;
}

(3) main() 函数

作用:

  • main() 函数是 程序的入口,必须返回 int(标准 C++ 要求)。
  • return 0; 表示正常结束,非 0 代表错误代码。

示例:

#include <iostream>
using namespace std;

int main() {
    cout << "Hello, C++!" << endl;
    return 0;  // 结束程序
}

(4) 函数指针

作用:
指向函数的指针,用于回调、动态函数调用

示例:

#include <iostream>
using namespace std;

void hello() 
{ 
    cout << "Hello, C++!" << endl; 
}

int main() {
    void (*funcPtr)() = hello; // 声明函数指针
    funcPtr();  // 通过指针调用函数

    system("pause");
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奕天者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值