文章目录
一 为什么引入重载
(一)函数重载
对于功能相同但是处理的数据类型不同时,我们需要针对不同类型分别写不同函数;但是C语言中函数名不能重复,还需要花式起不同的名字;
比如两个数相加的函数,int和int,int和float,int和double,,,每种都得写一个函数,函数名还不能重复,那就得写add_int_int(),add_int_float();add_int_double(),,,好麻烦呀;
C++有了函数的重载,我们可以写不同的函数而用相同的函数名,那么上面例子里的函数全都叫add();我们只需要管处理的数据类型;这多方便;
(二)运算符的重载
二 重载的定义
(一)函数重载
在同一作用域内,函数名相同,形参列表中的参数类型,参数个数,参数顺序三个中至少一个不同的一组函数;
注意点:
1、函数名相同,这是前提,也是目的;
2、重载函数靠形参列表来定义、区分和调用;和返回值类型,函数体的内容,是否是引用,指针等无关;
3、但是重载函数的代码或者说功能应该相似,否则为什么用相同的函数名呢?
4、函数返回值类型,按需选取,与重载无关;
(二)运算符重载
三 重载的代码举例
(一)函数重载
写一个相加的例子:
#include <iostream>
using namespace std;
int add(int a, int b)
{
return a+b;
}
int add(int a, int b, int c)
{
return a+b+c;
}
double add(double a, double b)
{
return a+b;
}
double add(int a, double b)
{
return a+b;
}
double add(double a, int b)
{
return a+b;
}
string add(string a, string b)
{
return a+b;
}
int main()
{
cout << add(1, 2) << endl;;
cout << add(1, 2, 3) << endl;;
cout << add(1.2, 2.3) << endl;;
cout << add(1, 2.3) << endl;;
cout << add(1.2, 2) << endl;;
cout << add("hello ", "world") << endl;;
return 0;
}
结果:
3
6
3.5
3.3
3.2
hello world
一点注意事项
直接写3.14这样的实数,默认是double类型;如果调用add(1.2, 2.3);则需要定义add(double, double);
1、如果定义了add(double, double);那么不会出问题;
2、如果没有定义add(double, double)而定义了add(int, int);add(float ,float);这两个中的任一个;编译器不会停下,会把double类型的1.2和2.3被转成int或者float;
(1)是add(int, int);则这两个数会被转成int型的1和2,则返回的结果是3;
(2)是add(float, float);则double转float,如果精度要求高,会丢失精度;本例中精度很低,能有期望值3.5;
3、如果没有定义add(double, double)而同时定义了add(int, int);add(float ,float);则编译不通过;因为编译器不知道到底往哪个类型转;
代码如下:
定义了双double:
#include <iostream>
using namespace std;
int add(int a, int b)
{
return a+b;
}
float add(float a, float b)
{
return a+b;
}
double add(double a, double b)
{
return a+b;
}
int main()
{
cout << add(1.2, 2.3) << endl;;
return 0;
}
结果:
3.5
只定义了双int
#include <iostream>
using namespace std;
int add(int a, int b)
{
return a+b;
}
int main()
{
cout << add(1.2, 2.3) << endl;;
return 0;
}
结果:
3
只定义了双float:
#include <iostream>
using namespace std;
float add(float a, float b)
{
return a+b;
}
int main()
{
cout << add(1.2, 2.3) << endl;;
return 0;
}
结果:
3.5
同时定义了双int和双float:
#include <iostream>
using namespace std;
int add(int a, int b)
{
return a+b;
}
float add(float a, float b)
{
return a+b;
}
int main()
{
//编译不通过;
cout << add(1.2, 2.3) << endl;;
return 0;
}
编译不通过
(二)运算符重载
四 重载原理
(一)函数重载原理
编译器编译时会对每个函数进行重命名;C语言程序编译时,只会给函数名前加_;相同的函数名经过编译后还是相同,因此C语言中不能有函数名重复;而C++程序在编译时每个函数名会改成记录函数名、返回值类型、每个形参和形参类型的版本;因此,经过编译,C++程序中重载的一组函数每个函数名都不相同,而且可以根据带入的实参类型来判断要调用哪个函数;
所以,C语言不支持函数重载而C++支持;