1.函数重载定义
函数重载:函数重载是指在同一作用域内,可以有一组具有相同函数名,不同参数列表的函数,这组函数被称为重载函数。重载函数通常用来命名一组功能相似的函数,这样做减少了函数名的数量,避免了名字空间的污染,对于程序的可读性有很大的好处。
2.为什么需要函数重载
如果没有函数重载机制,如在C中,你必须要这样去做:
int ADD1(int a, int b); //将int变量的值相加
float ADD2(float a, float b); //将float变量的值相加
int ADD3(int a, char b); //将int变量和char变量的值相加
float ADD4(float a, long b); //将float变量和long变量的值相加
而在C++中可以使用函数重载,使函数调用更加简单方便,但必须遵循以下规则:
•函数名称必须相同。
•参数列表必须不同(个数不同、类型不同或参数排列顺序不同等)。
•函数的返回类型可以相同也可以不相同。
•仅仅返回类型不同不足以成为函数的重载。
3.为什么C语言不支持函数重载而C++支持
原因很简单,代码从编译到运行要经过以下步骤:
1.预处理 (生成.i文件)
1)头文件展开
2)宏替换
3)去注释
4)条件编译
2.编译过程:检查语法,将高级语言转为汇编语言; (生成.s文件)
3.汇编过程:汇编语言转为二进制程序;(生成.o文件)
4.链接部分:所引用的数据链接进来。(生成a.out文件)
而编译器在编译时会对函数进行重命名,在这里以ADD函数为例:
//C++文件
#include <iostream>
using namespace std;
int ADD(int a, int b)
{
return a + b;
}
float ADD(float a, float b)
{
return a + b;
}
int ADD(int a, char b)
{
return a + b;
}
float ADD(float a, long b)
{
return a + b;
}
int main()
{
int ret1 = ADD(2, 3);
float ret2 = ADD(2.0f, 3.5f);
int ret3 = ADD(2, 'a');
float ret4 = ADD(2.4f, 3l);
cout << ret1 << endl;
cout << ret2 << endl;
cout << ret3 << endl;
cout << ret4 << endl;
return 0;
}
输出结果为:
若将文件重命名为.c文件将无法编译。
原因在于在c语言中,编译器在编译后在库中的名字全为_ADD ,不能进行链接。
而在c++中,编译器在编译后在库中的名字为_Z3ADDic等,各个函数编译后的名字不同,编译器可以识别各个函数,可执行链接。
4.为什么函数重载不可以根据返回类型区分
如:
float Add(int a, int b);
int Add(int a, int b);
当你在调用时并不能指定类型信息,编译器不知道你要调用哪个函数。比如调用Add(2,3)时,编译器无法判断到底调用的是那个函数,从这一点可看出函数重载不可以根据返回类型区分。
5.缺省参数
所谓缺省参数,顾名思义,就是在声明函数的某个参数的时候为之指定一个默认值,在调用该函数的时候如果采用该默认值,你就无须指定该参数。缺省参数使用主要规则:
1.调用时你只能从最后一个参数开始进行省略,换句话说,如果你要省略一个参数,你必须省略它后面所有的参数而不能省略中间参数,即:带缺省值的参数必须放在参数表的最后面。
2.缺省值必须是常量。
3.缺省参数必须通过值参或常参传递。声明是带有缺省参数的函数,则缺省值只能写在声明当中。
4.若没传所缺省的参数,则使用缺省参数,若传参了则使用所传参数。
如:
int Add(int a, int b=2) //半缺省
{
return a+b;
}
Add(3)=5
Add(4)=4
Add(2,1)=3