C++初阶函数重载详细讲解

 更新时间:2026年05月25日 09:33:44   作者:霍霍的袁  
在C++中,函数重载允许同一作用域内存在多个同名函数,条件包括参数个数、类型或顺序不同,避免重载与缺省参数导致的调用歧义,确保代码清晰高效,本文介绍C++初阶函数重载详细讲解,感兴趣的朋友一起看看吧

前言

在 C 语言中,同一个作用域内不能定义同名函数,一旦重复定义就编译报错。
而 C++ 引入了函数重载特性,允许同一作用域下存在多个同名函数,只要参数列表有差异即可。

一、什么是函数重载

官方定义:
同一个作用域中,存在多个函数名相同,但参数列表不同的一组函数,称之为函数重载

二、构成函数重载的 3 种合法条件

只要满足任意一种,即可构成重载:

  1. 参数个数不同
  2. 参数类型不同
  3. 参数类型的顺序不同

注意:和返回值参数变量名无关。

1. 参数个数不同

#include<iostream>
using namespace std;
// 无参
void f()
{
    cout << "f()" << endl;
}
// 1个参
void f(int a)
{
    cout << "f(int a)" << endl;
}
int main()
{
    f();    // 调用无参版本,即输出:f()
    f(10);  // 调用有参版本,即输出:f(int a)
    return 0;
}

2. 参数类型不同

#include<iostream>
using namespace std;
int Add(int left, int right)
{
    cout << "int 版本" << endl;
    return left + right;
}
double Add(double left, double right)
{
    cout << "double 版本" << endl;
    return left + right;
}
int main()
{
    Add(10, 20);        // 匹配int版本
    Add(10.5, 20.5);    // 匹配double版本
    return 0;
}

3. 参数类型顺序不同

参数个数相同、类型相同,仅顺序调换,也可以构成重载:

#include<iostream>
using namespace std;
void f(int a, char b)
{
    cout << "f(int, char)" << endl;
}
void f(char b, int a)
{
    cout << "f(char, int)" << endl;
}
int main()
{
    f(10, 'a');	// 输出:f(int, char)
    f('a', 10);	// 输出:f(char, int)
    return 0;
}

三、绝对不能构成重载的 2 种情况

1. 仅返回值不同,不能构成重载

// 错误!仅返回值不同,不构成重载
void fxx()
{}
int fxx()
{
    return 1;
}

原因:
函数调用时,编译器只看参数,不看返回值;
调用 fxx(); 编译器无法区分该调用哪个版本,直接编译报错

2. 仅参数名字不同,不能构成重载

void fun(int a)
{}
void fun(int b)  // 不算重载!参数名不参与重载判定
{}

四、函数重载 + 缺省参数 = 歧义陷阱(易错点)

重载和缺省参数混用,极易产生调用歧义,编译报错。
举个例子:

#include<iostream>
using namespace std;
// 重载版本1:无参
void f1()
{
    cout << "f()" << endl;
}
// 重载版本2:带缺省参数
void f1(int a = 10)
{
    cout << "f(int a)" << endl;
}
int main()
{
    f();   // 编译报错!歧义
    return 0;
}

报错原因:
调用 f1() 不传参时:

  • 可以调用无参 f1()
  • 也可以调用带缺省的 f1(int a = 10)

编译器不知道选哪个,产生二义性,直接编译失败。
因此:写重载函数时,尽量不要给参数设置缺省值。

总结

到此这篇关于C++初阶函数重载详细讲解的文章就介绍到这了,更多相关C++函数重载内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++实现的泛型List类分享

    C++实现的泛型List类分享

    这篇文章主要介绍了C++实现的泛型List类分享,参考C#的List功能实现,需要的朋友可以参考下
    2014-07-07
  • 基于C语言实现五子棋游戏

    基于C语言实现五子棋游戏

    这篇文章主要为大家详细介绍了基于C语言实现五子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11
  • C++索引越界的解决方法

    C++索引越界的解决方法

    本文主要介绍了C++索引越界的解决方法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • C++中“#”号的使用技巧

    C++中“#”号的使用技巧

    本篇文章是对C++中“#”号的使用技巧进行了分析介绍,需要的朋友参考下
    2013-05-05
  • C语言编程之扫雷小游戏空白展开算法优化

    C语言编程之扫雷小游戏空白展开算法优化

    扫雷是电脑上很经典的游戏,特意去网上玩了一会,几次调试之后,发现这个比三子棋要复杂一些,尤其是空白展开算法上和堵截玩家有的一拼,与实际游戏差别较大,不能使用光标,下面来详解每一步分析
    2021-09-09
  • C++的类型转换(强转)你了解吗

    C++的类型转换(强转)你了解吗

    这篇文章主要为大家详细介绍了C++的类型转换,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02
  • 超详细VScode调试教程tasks.json和launch.json的设置

    超详细VScode调试教程tasks.json和launch.json的设置

    vscode是一个轻量级的文本编辑器,但是它的扩展插件可以让他拓展成功能齐全的IDE,这其中就靠的是tasks.json和launch.json的配置,下面这篇文章主要给大家介绍了关于超详细VScode调试教程tasks.json和launch.json设置的相关资料,需要的朋友可以参考下
    2022-10-10
  • C语言 队列的实现全解析

    C语言 队列的实现全解析

    队列(Queue)与栈一样,是一种线性存储结构,它具有如下特点:队列中的数据元素遵循“先进先出”(First In First Out)的原则,简称FIFO结构。在队尾添加元素,在队头删除元素
    2022-04-04
  • VS2013安装配置和使用Boost库教程

    VS2013安装配置和使用Boost库教程

    这篇文章主要为大家详细介绍了VS2013安装配置和使用Boost库的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • C/C++实现词法分析程序的示例代码

    C/C++实现词法分析程序的示例代码

    这篇文章主要为大家详细介绍了如何基于C/C++实现一个简单的词法分析程序,并通过完成词法分析程序,了解词法分析的过程,感兴趣的小伙伴可以跟随小编一起学习学习
    2023-05-05

最新评论