本篇将主要介绍C++中的函数重载定义及条件,所谓的函数重载即同一作用域中可以有多个同名函数,调用时按照参数调用。
总结:
1.函数重载的定义:同一作用域中可以有多个同名函数,调用时按照参数调用。
2.函数重载的条件:
- 函数名必须相同
- 函数参数个数不同、类型不同、顺序不同
- 函数返回值不做考虑、_stdcall/_cdecl等调用约定不做考虑
- 作用域相同
1.C语言中实现多类型参数的函数调用
首先看一段C中利用宏实现值的大小比较的代码:
#include <iostream>
//利用宏来比较两个数的大小
//由于宏不检查数据类型,对于任意数据类型都是可以用来比较的
//但就是因为不检查数据类型检查,可能出现问题,因此不建议用来表示函数
#define GETMAX(a,b) ((a)>(b))? (a):(b);
int main(int argc, char* argv[])
{
int n = GETMAX(1,2);
return 0;
}
运行结果:
当main中改为:int n = GETMAX(1.0f,2.0f);
返回值一样。
由于宏不检查数据类型,对于任意数据类型都是可以用来比较的,但就是因为不检查数据类型检查,可能出现问题,因此不建议用来表示函数
2.C++中函数重载的定义
为了解决宏不能进行类型检查问题,我们可以使用函数来设置数据类型,但是一旦限制数据类型,一个函数就对应一种情况。
为了应对不同数据类型的情况,我们可能就需要写多个函数,如果都使用一个函数名,但是数据类型的不同这样可以吗?
以下代码:其中有2个gexMax
同名的函数,参数对应的数据类型不同
#include <iostream>
//利用宏来比较两个数的大小
#define GETMAX(a,b) ((a)>(b))? (a):(b);
int gexMax(int a, int b) {
return ((a) > (b)) ? (a) : (b);
}
char* gexMax(char* a, char* b) {
return ((a) > (b)) ? (a) : (b);
}
int main(int argc, char* argv[])
{
int n = GETMAX(1,2);
return 0;
}
C中肯定是不可以的,可以通过将后缀.CPP
改为.C
编译查看,结果如下:显示函数重定义
而在C++中是可以编译通过的,这就说明C++中有一种新的语法再支持多个同名函数的情况,这种语法就成为函数重载。
函数重载的定义:C++中允许出现同名的函数
。
3.函数重载的条件
谈到函数,我们需要知道函数的要素包括:函数名,函数参数,函数返回值,函数的调用约定
。同样的谈到重载也需要从这几个方面考虑。
当函数一模一样的时候,编译是否可以通过呢?有如下代码:
#include <iostream>
int gexMax(int a, int b) {
return ((a) > (b)) ? (a) : (b);
}
int gexMax(int a, int b) {
return ((a) > (b)) ? (a) : (b);
}
运行结果:显示已经有主体,函数一模一样是不行的
3.1 函数名必须相同
3.2 函数参数个数不同、类型不同、顺序不同
以下代码包含了函数参数个数不同、类型不同、顺序不同,可以正常编译
#include <iostream>
int gexMax(int a, float b) {
return ((a) > (b)) ? (a) : (b);
}
int gexMax(float a, int b,int c) {
return ((a) > (b)) ? (a) : (b);
}
3.3 函数返回值不做考虑、_stdcall/_cdecl等调用约定不做考虑
- 当返回值不同时,不会构成重载
#include <iostream>
float gexMax(int a, float b) {
return ((a) > (b)) ? (a) : (b);
}
int gexMax(int a, float b) {
return ((a) > (b)) ? (a) : (b);
}
运行结果:
- 当调用约定不同时,不会构成函数重载
int _stdcall gexMax(int a, int b) {
return ((a) > (b)) ? (a) : (b);
}
int _cdecl gexMax(int a, int b) {
return ((a) > (b)) ? (a) : (b);
}
运行结果:
3.4 作用域相同
当函数不在一个作用域时,是不会检查函数重载的
float gexMax(int a, float b) {
return ((a) > (b)) ? (a) : (b);
}
namespace ShieldMad {
int gexMax(int a, float b) {
return ((a) > (b)) ? (a) : (b);
}
}
运行结果:不会构成重载
4.学习视频地址:C++57个入门知识点_12 函数重载及其条件