找回密码
 register

QQ登录

只需一步,快速开始

查看: 24|回复: 0

[C++] C++函数重载详解

[复制链接]

[C++] C++函数重载详解

[复制链接]
  • 打卡等级:热心大叔
  • 打卡总天数:243
  • 打卡月天数:20
  • 打卡总奖励:241
  • 最近打卡:2025-07-22 08:02:38
Waylee

主题

0

回帖

2万

积分

仙帝

积分
26280
Waylee 2025-7-19 13:05 | 显示全部楼层 |阅读模式 | Google Chrome | Windows 10

马上注册,查看网站隐藏内容!!

您需要 登录 才可以下载或查看,没有账号?register

×

函数重载(Function Overloading)

在 C++ 中,同一个作用域(如同一命名空间或类中)可以定义多个名称相同参数列表不同的函数,这种机制称为 函数重载。重载可以让函数名承载多种用途,使代码更简洁、更易维护。


1. 重载的必要性

假设我们需要实现“交换两个变量值”的功能,支持多种基本类型:

  • 在 C 语言中,通常需要为每种类型写一个不同名字的函数:

    void swap_int(int *a, int *b);
    void swap_float(float *a, float *b);
    void swap_char(char *a, char *b);
    void swap_bool(bool *a, bool *b);
  • 在 C++ 中,只要函数名相同、参数签名不同,就可通过重载统一成一个 Swap

    void Swap(int* , int*);
    void Swap(float*, float*);
    void Swap(char* , char*);
    void Swap(bool*, bool*);

2. 示例:重载交换函数

#include <iostream>
using namespace std;

// 交换 int
void Swap(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

// 交换 float
void Swap(float *a, float *b) {
    float temp = *a;
    *a = *b;
    *b = temp;
}

// 交换 char
void Swap(char *a, char *b) {
    char temp = *a;
    *a = *b;
    *b = temp;
}

// 交换 bool
void Swap(bool *a, bool *b) {
    bool temp = *a;
    *a = *b;
    *b = temp;
}

int main() {
    int   n1 = 100, n2 = 200;
    float f1 = 12.5f, f2 = 56.93f;
    char  c1 = 'A', c2 = 'B';
    bool  b1 = false, b2 = true;

    Swap(&n1, &n2);
    cout << n1 << ", " << n2 << endl;   // 200, 100

    Swap(&f1, &f2);
    cout << f1 << ", " << f2 << endl;   // 56.93, 12.5

    Swap(&c1, &c2);
    cout << c1 << ", " << c2 << endl;   // B, A

    Swap(&b1, &b2);
    cout << b1 << ", " << b2 << endl;   // 1, 0

    return 0;
}

注意
这里示例使用 Swap 而非标准库的 swap,以免与 <algorithm> 中的 std::swap 冲突。本示例纯属演示,实际开发建议直接使用标准库的 std::swap


3. 重载规则

要构成合法的函数重载,需同时满足以下两点:

  1. 函数名相同
  2. 参数列表(签名)不同 —— 只要满足下面任意一项,即可视为“不同”:

    • 参数个数不同
    • 参数类型不同
    • 参数顺序不同

注意

  • 返回类型不同 不能 单独用于区分重载:如果只有返回类型不一样,而参数列表完全相同,编译会报“重定义”错误。
  • 为了可读性与维护性,重载函数应当完成相近或相关的功能,不建议用同名实现全然无关的逻辑。

4. 编译器如何支持重载

C++ 编译器在内部对重载函数进行 名称修饰(Name Mangling),将每个重载版本的名称与参数类型编码到符号表中。例如:

  • void Swap(int*,int*)_Z4SwapiPiS0_ (示意,实际各编译器不同)
  • void Swap(float*,float*)_Z4SwapPfS0_

重载决议(Overload Resolution)阶段,编译器根据调用时的实参类型,选择最匹配的重载版本;若无法唯一匹配或类型不兼容,则报错。


5. 何时使用重载

  • 同一功能、不同类型 的场景,如数学运算、输入输出等。
  • 接口一致性:保持函数名统一,调用端更易记忆。
  • 对于跨类型、跨容器、跨维度的操作,模板(Templates)往往比重载更灵活,此处示例仅为重载入门。

6. 小结

  • 函数重载是 C++ 提供的便利特性,让同一函数名可用于多种参数类型。
  • 遵循重载规则、保持重载函数功能一致,有助于提高代码可读性和可维护性。
  • 在实际项目中,标准库的大多数算法和容器都采用了重载和模板技术,建议优先使用标准库。
您需要登录后才可以回帖 登录 | register

本版积分规则

雪舞知识库 | 浙ICP备15015590号-1 | 萌ICP备20232229号|浙公网安备33048102000118号 |网站地图|天天打卡

GMT+8, 2025-7-22 19:07 , Processed in 0.102025 second(s), 5 queries , Redis On.

Powered by XueWu Licensed

Copyright © Tencent Cloud.

快速回复 返回顶部 返回列表