news 2026/7/27 7:11:01

C++超详细讲解函数重载

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++超详细讲解函数重载

1 函数重载的定义

函数重载:使用同一个函数名定义不同的函数。从本质上来看,就是互相独立的不同函数,每一个函数类型不同。因此,函数重载是由函数名和参数列表决定的。

注意:函数返回值不能作为函数重载的重要依据!

2 构成函数重载的条件

当满足以下三个条件之一时,便可以构成函数重载

函数参数个数不同

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

// 函数类型:void(int)

voidDemo(intx)

{

printf("x = %d\r\n", x);

}

// 函数类型:void(int, int)

voidDemo(intx,inty)

{

printf("x = %d\r\n", x);

printf("y = %d\r\n", y);

}

// 函数类型:void(int, int, int)

voidDemo(intx,inty,intz)

{

printf("x = %d\r\n", x);

printf("y = %d\r\n", y);

printf("z = %d\r\n", z);

}

函数参数类型不同

1

2

3

4

5

6

7

8

voidDemo(intx)

{

printf("x = %d\r\n", x);

}

voidDemo(charx)

{

printf("x = %c\r\n", x);

}

函数参数顺序不同

1

2

3

4

5

6

7

8

9

10

voidDemo(charc,intx)

{

printf("x = %d\r\n", x);

printf("c = %c\r\n", c);

}

voidDemo(intx,charc)

{

printf("x = %d\r\n", x);

printf("c = %c\r\n", c);

}

但是,如果函数的参数类型均相同,仅仅顺序不同同样会出错,如下所示的代码:

1

2

3

4

5

6

7

8

9

10

11

12

voidDemo(intx,inty,intz)

{

printf("x = %d\r\n", x);

printf("y = %d\r\n", y);

printf("z = %d\r\n", z);

}

voidDemo(inty,intx,intz)

{

printf("x = %d\r\n", x);

printf("y = %d\r\n", y);

printf("z = %d\r\n", z);

}

3 编译器调用重载函数的准则

编译器编译代码的流程:

将所有同名函数作为候选者

尝试寻找可行的候选函数

  • 精确匹配实参
  • 通过默认参数匹配实参
  • 通过默认类型转换匹配实参

匹配成功

如果编译失败的话,有如下两种情况:

  • 找到的候选函数不唯一,出现二义性,失败
  • 无法匹配所有候选者,函数未定义,失败

4 函数重载的注意事项

4.1 避开重载带有指定默认值参数的函数

在我们使用函数重载的过程,要注意避开重载带有指定默认值参数的函数。否则在使用的过程中,会出现二义性,导致编译失败。如下代码所示的错误示例:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

voidDemo(intx,inty)

{

printf("x = %d\r\n", x);

printf("y = %d\r\n", y);

}

voidDemo(intx,inty,intz = 0)

{

printf("x = %d\r\n", x);

printf("y = %d\r\n", y);

printf("z = %d\r\n", z);

}

intmain()

{

Demo(1, 2);

return0;

}

当对重载函数进行调用时Demo(1, 2),编译器是无法分辨我们到底是使用void Demo(int x, int y)函数,还是使用void Demo(int x, int y, int z = 0)函数,因此无法编译通过。

4.2 注意函数重载遇上函数指针

重载函数的名称赋值给函数指针后,当对函数指针进行调用时,将根据下面的方式进行函数匹配

  1. 首先,根据重载规则挑选与函数指针参数列表一致的候选者
  2. 然后,根据候选者的函数类型与函数指针的函数类型进行匹配

通过如下代码所示的示例进行解释:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

typedefint(*PDemo)(inti);

// Demo1

intDemo(intx)

{

returnx;

}

// Demo2

intDemo(intx,inty)

{

returnx * y;

}

// Demo3

intDemo(constchar* c)

{

returnstrlen(c);

}

intmain()

{

inti = 0;

PDemo pd = Demo;

// 一个参数,因此不是Demo1就是Demo3

// pd的函数类型是int(int)与Demo1相同,因此就是Demo1

i = pd(1);

return0;

}

如果将上述示例中函数指针的返回类型由int更改成double,仍通过pd(1)进行调用的话,该程序将不能被编译过,因为没有与之匹配的重载函数。

  1. 参数列表没有问题
  2. 函数返回值类型有问题,因为函数类型包含函数的返回值类型

4.3 C++编译器不能以 C 的方式编译重载函数

由于 C++ 编译器将函数名和参数列表编译成目标名,C 编译器将函数名编译成目标名,这样 C 编译器编译后的重载函数的目标名一致,于是便无法实现重载函数的功能。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/27 7:10:01

AI写作工具如何助力自考论文高效创作

1. 项目背景与核心价值作为一名长期关注内容创作工具发展的从业者,我注意到近年来AI写作技术正在经历从"玩具"到"生产力工具"的质变。特别是对于需要高频产出规范性文本的用户群体,比如每年数百万的自考考生,论文写作始终…

作者头像 李华
网站建设 2026/7/27 7:06:58

【全球首份AI配色无障碍白皮书】:基于17国色觉数据训练的自适应调色模型(含Figma插件+React Hook开源交付)

更多请点击: https://intelliparadigm.com 第一章:【全球首份AI配色无障碍白皮书】发布背景与核心价值 随着数字产品普及率持续攀升,视觉障碍用户与色觉差异群体对界面可访问性的诉求日益迫切。传统配色方案多依赖设计师主观经验或静态对比度…

作者头像 李华
网站建设 2026/7/27 7:06:19

PDF解析与RAG技术实战:企业级AI应用核心能力解析

1. 面试背景与核心考察点解析飞致云信息科技的这场模拟面试聚焦三个硬核技术领域:PDF解析、RAG技术架构和全栈工程能力。作为AI赛道头部企业,其面试设计直指当前企业级AI应用落地的三大痛点——非结构化数据处理(PDF)、知识增强生…

作者头像 李华
网站建设 2026/7/27 6:58:25

Godot 4游戏开发:敌机系统设计与实现全解析

1. 项目概述与核心思路最近在捣鼓一个竖版太空射击游戏,也就是我们小时候在街机厅里玩的那种“打飞机”游戏。用Godot 4来做这件事,感觉特别顺手,尤其是它那个节点组件化的设计,让游戏逻辑的搭建变得像搭积木一样清晰。上一期我们…

作者头像 李华
网站建设 2026/7/27 6:56:44

C/C++闰年判断:从基础语法到逻辑建模的编程思维训练

1. 项目概述:从“闰年判断”窥探C/C编程的基石 最近在带新人,发现很多初学者在接触C或C时,面对的第一个有逻辑挑战的小练习往往就是“闰年判断”。别看这个题目简单,它就像一面镜子,能清晰地照出一个程序员对基础语法、…

作者头像 李华
网站建设 2026/7/27 6:53:48

深入解析AM1806 ARM微处理器:架构、外设与嵌入式系统设计实践

1. 项目概述:深入解析AM1806 ARM微处理器在嵌入式系统开发领域,选对一颗处理器往往意味着项目成功了一半。这颗芯片不仅要能满足当前的功能需求,还得在功耗、成本、外设资源和长期供货稳定性之间找到最佳平衡点。我接触过不少ARM9时代的经典芯…

作者头像 李华