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

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

目录

1 函数重载的定义

2 构成函数重载的条件

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

4 函数重载的注意事项

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

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

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

1 函数重载的定义

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

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

2 构成函数重载的条件

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

函数参数个数不同

// 函数类型:void(int) void Demo(int x) { printf("x = %d\r\n", x); } // 函数类型:void(int, int) void Demo(int x, int y) { printf("x = %d\r\n", x); printf("y = %d\r\n", y); } // 函数类型:void(int, int, int) void Demo(int x, int y, int z) { printf("x = %d\r\n", x); printf("y = %d\r\n", y); printf("z = %d\r\n", z); }

函数参数类型不同

void Demo(int x) { printf("x = %d\r\n", x); } void Demo(char x) { printf("x = %c\r\n", x); }

函数参数顺序不同

void Demo(char c, int x) { printf("x = %d\r\n", x); printf("c = %c\r\n", c); } void Demo(int x, char c) { printf("x = %d\r\n", x); printf("c = %c\r\n", c); }

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

void Demo(int x, int y, int z) { printf("x = %d\r\n", x); printf("y = %d\r\n", y); printf("z = %d\r\n", z); } void Demo(int y, int x, int z) { printf("x = %d\r\n", x); printf("y = %d\r\n", y); printf("z = %d\r\n", z); } 3 编译器调用重载函数的准则

编译器编译代码的流程:

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

尝试寻找可行的候选函数

精确匹配实参

通过默认参数匹配实参

通过默认类型转换匹配实参

匹配成功

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

找到的候选函数不唯一,出现二义性,失败

无法匹配所有候选者,函数未定义,失败

4 函数重载的注意事项 4.1 避开重载带有指定默认值参数的函数

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

void Demo(int x, int y) { printf("x = %d\r\n", x); printf("y = %d\r\n", y); } void Demo(int x, int y, int z = 0) { printf("x = %d\r\n", x); printf("y = %d\r\n", y); printf("z = %d\r\n", z); } int main() { Demo(1, 2); return 0; }

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

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

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

首先,根据重载规则挑选与函数指针参数列表一致的候选者

然后,根据候选者的函数类型与函数指针的函数类型进行匹配

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

typedef int(*PDemo)(int i); // Demo1 int Demo(int x) { return x; } // Demo2 int Demo(int x, int y) { return x * y; } // Demo3 int Demo(const char* c) { return strlen(c); } int main() { int i = 0; PDemo pd = Demo; // 一个参数,因此不是Demo1就是Demo3 // pd的函数类型是int(int)与Demo1相同,因此就是Demo1 i = pd(1); return 0; }

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

参数列表没有问题

函数返回值类型有问题,因为函数类型包含函数的返回值类型

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

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

到此这篇关于C++超详细讲解函数重载的文章就介绍到这了,更多相关C++函数重载内容请搜索易知道(ezd.cc)以前的文章或继续浏览下面的相关文章希望大家以后多多支持易知道(ezd.cc)!

推荐阅读

    excel怎么用乘法函数

    excel怎么用乘法函数,乘法,函数,哪个,excel乘法函数怎么用?1、首先用鼠标选中要计算的单元格。2、然后选中单元格后点击左上方工具栏的fx公

    opporeno8参数配置及价格

    opporeno8参数配置及价格,面部,亿元,Oppo的荣誉2020年1月4日,接近屏幕关闭传感器是否支持双卡:支持oppor11splus什么时候上市的Oppo R11S P

    excel中乘法函数是什么?

    excel中乘法函数是什么?,乘法,函数,什么,打开表格,在C1单元格中输入“=A1*B1”乘法公式。以此类推到多个单元。1、A1*B1=C1的Excel乘法公式

    魅蓝note6性能参数有哪些

    魅蓝note6性能参数有哪些,摄像头,蓝牙,魅蓝note6性能参数有哪些魅力蓝色Note6最好拍照。电池寿命更长。蓝色Note6使用高通 snapdragon 625

    标准差excel用什么函数?

    标准差excel用什么函数?,函数,标准,什么,在数据单元格的下方输入l标准差公式函数公式“=STDEVPA(C2:C6)”。按下回车,求出标准公差值。详细

    设置总账参数|用友u8设置总账参数

    设置总账参数|用友u8设置总账参数,,1. 用友u8设置总账参数1、首先要点开数据权限控制设置;2、选择想要设置控制的单据;3、打开后看到左上角

    csgo参数设置|csgo怎么保存

    csgo参数设置|csgo怎么保存,,csgo怎么保存第一步下载csgo的官方版本。然后再下载一个5e对战平台,PS:5e的账号和csgo的账号不是一个账号。第

    移动apn设置|移动apn设置参数

    移动apn设置|移动apn设置参数,,移动apn设置参数1、打开手机系统设置界面应用,点击页面中的“移动网络”设置选项。2、进入移动网络设置页面