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

文章目录

  • 前言
  • 一、什么是函数重载
  • [二、构成函数重载的 3 种合法条件](#二、构成函数重载的 3 种合法条件)
    • [1. 参数个数不同](#1. 参数个数不同)
    • [2. 参数类型不同](#2. 参数类型不同)
    • [3. 参数类型顺序不同](#3. 参数类型顺序不同)
  • [三、绝对不能构成重载的 2 种情况](#三、绝对不能构成重载的 2 种情况)
    • [1. 仅返回值不同,不能构成重载](#1. 仅返回值不同,不能构成重载)
    • [2. 仅参数名字不同,不能构成重载](#2. 仅参数名字不同,不能构成重载)
  • [四、函数重载 + 缺省参数 = 歧义陷阱(易错点)](#四、函数重载 + 缺省参数 = 歧义陷阱(易错点))
  • 总结

前言

在 C 语言中,同一个作用域内不能定义同名函数 ,一旦重复定义就编译报错。

而 C++ 引入了函数重载 特性,允许同一作用域下存在多个同名函数,只要参数列表有差异即可。


一、什么是函数重载

官方定义:

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

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

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

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

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

1. 参数个数不同

cpp 复制代码
#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. 参数类型不同

cpp 复制代码
#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. 参数类型顺序不同

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

cpp 复制代码
#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. 仅返回值不同,不能构成重载

cpp 复制代码
// 错误!仅返回值不同,不构成重载
void fxx()
{}

int fxx()
{
    return 1;
}

原因:

函数调用时,编译器只看参数 ,不看返回值;

调用 fxx(); 编译器无法区分该调用哪个版本,直接编译报错。

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

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

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

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

举个例子:

cpp 复制代码
#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)

编译器不知道选哪个,产生二义性 ,直接编译失败。

因此:写重载函数时,尽量不要给参数设置缺省值。


总结

看到这的小伙伴可以点个赞吗?你的点赞是我更新的动力!!!ヾ(≧▽≦*)o

相关推荐
鶴哥只手遮天1 分钟前
OpenFOAM 源码深度剖析 · 第二季-14 `functionObjects`、求解器控制框架 与 表达式系统
算法·开源
鶴哥只手遮天1 分钟前
OpenFOAM 源码深度剖析 · 第二季-13 `fvOptions` / `fvConstraints` / `corrections`
算法·开源
鶴哥只手遮天4 分钟前
OpenFOAM 源码深度剖析 · 第二季-03 拉格朗日粒子与喷雾:`Cloud`/`parcel` 模板体系、运动积分与子模型群
算法·开源
hetao17338379 分钟前
校内场-提高组 ZYZSC-S-Round 2
c++·算法
小严不想当码农10 分钟前
icpc 亚洲区域赛补题链接整理
算法
xiaok11 分钟前
Compositor图编辑器
算法
CAD开发小慧18 分钟前
CAE软件开发:Coreform为何用ACIS处理CAD几何?
算法·架构·计算机图形学
七牛云行业应用22 分钟前
DeepSeek Harness 自定义 Skill 教程:从 SKILL.md 到可复用 Agent 工作流
算法·github
hetao173383726 分钟前
2026-10-14 hetao1733837 的刷题记录
c++·算法
临床数据科学和人工智能兴趣组29 分钟前
在R语言的生态系统中,字符串处理一直是一个重要且复杂的任务
开发语言·正则表达式·r语言·r语言-4.2.1