函数重载:
在相同的声明域中的函数名相同的,而参数表不同的,即通过函数的参数表而唯一标识并且来区分函数的一种特殊的函数。
#include<iostream>
using namespace std;
void MyCout(int n)
{
cout << "输入的是整形!" << endl;
}
void MyCout(float n)
{
cout << "输入的是浮点型!" << endl;
}
void MyCout(char n)
{
cout << "输入的是字符!" << endl;
}
void MyCout(char* n)
{
cout << "输入的是字符串!" << endl;
}
void MyCout(int n,float m)
{
cout << "第一个参数为整形,第二个参数为浮点型!" << endl;
}
int main()
{
int a = 1;
float b = 1;
char c = '1';
char d[20] = { "2342" };
MyCout(a, b);
MyCout(a);
MyCout(b);
MyCout(c);
MyCout(d);
return 0;
system("pause");
}
运行结果如下:
从运行结果可以看出,虽然函数名一样,但根据你传入的参数不同编译器会为你成功调用对应的函数。这样函数名一样,参数不同(参数类型和参数数量不同均可)都可以构成函数重载。
重载原理
调用重载函数时编译器是如何准确找出我们真正所要调用的对应函数的呢?
我们可以从汇编层面来观察它的执行步骤:
从上面这幅图可以看出,在使用不同的参数调用重载函数时,call的目标函数名字虽然都是MyCout,但这些MyCout函数的内存地址都是不同的也就是说编译器为每个重载函数都在内存中划分出了一块空间,虽然函数名一样但本质上它们是4个函数
编译器编译函数时会生成一个编译符号,而这个编译符号是根据函数名,函数的参数表(包括参数类型和数量)相关的。而且不同的编译器的命名规则不一样。只要能保证相同的函数名和不同的函数参数列表生成的符号名不一样就行。
对于我们生成的变量编译器会保存一个叫符号表的东西,通过符号表我们可以知道这个变量的占用的空间,解析方式,自然也就知道他是属于哪种变量,
在函数重载时,根据变量所在符号表中的信息获得参数类型使用参数类型和参数名就能得到当前该调用函数正确的编译符号名也就能够成功调用我们所需要的函数了,