重载定义:
在 C++中,我们把具备相同功能的函数整合都一个函数上,而不必去写好多个函数名不同 的函数,这就 叫函数重载。
实作举例
比如我们要编写一个函数求一个数的 绝对值(但是整数,浮点型数,双精度型数)都有绝对值,但是我们为他们编写的函数返回值类型却是各不相同的比如:
int iabs(int a);
float fabs(float a);
double dabs(double a);
// main.cpp
##include<iostream>
using namespace std;
int abs(int a); // 当参数为整型数据 时的函数原型
float abs(float a);//当参数为浮点型数据时的函数原型
double abs(double a);//当参数为双精度型数据时 的函数原型
// 定义函数
int abs(int a) {
// 打印调用了哪个函数
cout << "call:int abs()" << endl;
return (a >= 0 ? a : -a);
}
float abs(float f) {
cout << "call:float abs()" << endl;
return (f >= 0 ? f : -f);
}
double abs(double d) {
cout << "call:double abs()" << endl;
return (d >= 0 ? d : -d);
}
int main() {
int a = -5;
float f = -2.4f;
double d = -3e-6;
// 输出函数的结果
cout << "a= " << abs(a) << endl;
cout << "f= " << abs(f) << endl;
cout << "e= " << abs(d) << endl;
}
结论:
运行结果表明:abs函数能够处理三种不同数据类型的数据,那么我们应该怎样编写重载函数了 ?
1:同一个函数写上多种函数原型
2:给这些函数写上定义
3:编译器依靠函数声明时参数个数,参数数据类型,参数顺序来判断到底运行那个函数,如果重载函数参数表完全相同,编译器是找不到到底运行哪个函数的,这个时候,程序就会报错。比如:int func(int a,char b) 和 float func(int a,char c) 这是不能重载的,在语法上就不能通过,直接报错:不能重载,仅依靠函数的返回值。
4:但是 在调用一个函数重载的时候,也可能会发生找不到一个完全合适的函数,这时候,就需要进行数据类型的 转换 ,但是由于这种方法可能导致数据丢失或者数据类型不严格符合 而报错,所以这种情况应该尽量避免。