当前位置: 首页 > news >正文

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 编译器编译后的重载函数的目标名一致,于是便无法实现重载函数的功能。

http://www.cnnetsun.cn/news/3678075.html

相关文章:

  • AI写作工具如何助力自考论文高效创作
  • 【全球首份AI配色无障碍白皮书】:基于17国色觉数据训练的自适应调色模型(含Figma插件+React Hook开源交付)
  • PDF解析与RAG技术实战:企业级AI应用核心能力解析
  • Godot 4游戏开发:敌机系统设计与实现全解析
  • C/C++闰年判断:从基础语法到逻辑建模的编程思维训练
  • 深入解析AM1806 ARM微处理器:架构、外设与嵌入式系统设计实践
  • WarcraftHelper:系统性解决魔兽争霸3现代系统兼容性问题的技术方案
  • JavaSE 基础语法 - 数组的定义与使用 - ②
  • 大语言模型专业能力边界研究:LLMs Reward Expertise现象解析
  • 深度学习新范式:嵌套学习与联想记忆系统解析
  • CRC控制器中断与状态寄存器配置详解:从硬件原理到嵌入式实战
  • 河洛数理:上古华夏的全域宇宙底层规律
  • C++构建高性能气象数据可视化分析系统:架构设计与工程实践
  • TMS320C40 DSP时序参数深度解析与通信端口硬件设计实战
  • 超精度计算与Excel体验融合:SpreadJS技术解析
  • gfx936 DCU上实现INT8 QK MMAC:分页访存、Fragment映射与GQA适配
  • WorkshopDL:跨平台Steam创意工坊模组下载的完整解决方案
  • Go语言时间格式化原理与实践指南
  • AIGC技术解析:从原理到行业应用实战
  • 强化学习在神经架构搜索与业务流程优化中的应用
  • 深入了解网工学习框架(初)
  • CUDA源码在苹果GPU运行:跨架构兼容性技术解析
  • 半监督学习:降低AI数据标注成本的核心技术
  • LoRA/QLoRA技术解析:大模型轻量化微调实战
  • 一张白底图成本从¥15→¥0.37?(2024头部MCN内部AI白底流水线全拆解,含Lora训练数据集链接)
  • 放弃复杂命令!Windows 可视化安装 OpenClaw,小白狂喜
  • AI在企业办公中的8大核心应用场景与实施策略
  • 船舶操纵运动仿真与Nomoto模型MATLAB实现
  • Matlab实现人工势场算法在无人机路径规划中的应用
  • TI TMS320C672x浮点DSP硬件设计实战:从电源时序到PCB布线的避坑指南