河北特定网站建设推荐,广州分销系统开发,莱芜杂谈莱芜话题,网站建设公司市场开发方案函数重载的定义
函数重载#xff1a;
是函数的一种特殊情况#xff0c;C允许在同一作用域重声明几个功能类似的同名函数#xff0c;这些同名函数的形参列表#xff08;参数个数或者类型#xff0c;类型的顺序#xff09;不同#xff0c;常用来处理实现功能类似数据结构…函数重载的定义
函数重载
是函数的一种特殊情况C允许在同一作用域重声明几个功能类似的同名函数这些同名函数的形参列表参数个数或者类型类型的顺序不同常用来处理实现功能类似数据结构不同的问题。
注意构成函数重载的几个函数的返回值必须是同一类型的。
void Add(int a, int b)
{cout a b endl;
}
void Add(double a, double b)
{cout a b endl;
}
int main()
{Add(1, 2);Add(1.1, 2.2);
} 但是如果不再同一个域里就不存在函数重载问题了如下
namespace shunshun
{void Add(int a, int b){cout a b endl;}
}namespace lili
{void Add(double a, double b){cout a b endl;}
}
稍作修改
namespace shunshun
{void Add(int a, int b){cout a b endl;}
}namespace shunshun
{void Add(double a, double b){cout a b endl;}
}
如上情况就会构成函数重载。 对于缺省参数
如下两个函数的参数个数不同构成重载但是会产生一定的问题。
void func(int a)
{cout void func(int a) endl;
}void func(int a, int b 1)
{cout void func(int a, int b) endl;
}int main()
{func(1);//这里就会存在调用歧义产生错误。return 0;
} 函数重载的原理
介绍完规则我们来分析一下函数重载的底层原理顺便解决一下几个问题
1.为什么c语言不支持函数重载而c可以
1.为什么函数同名而参数个数类型类型顺序不同就可以实现重载
3.为什么返回值类型不同不能实现函数重载 首先我们得先了解一下文件的编译过程详解编译过程编译链接_LILI_Plusing的博客-CSDN博客
在编译环节我们进行了语法词法语义分析并且进行了符号的汇总以便到 汇编阶段生成符号表。
符号表是用来干什么的呢
简单来说就是我们调用函数时要根据符号表找到函数名然后找到其地址才能调用。
笔记-函数栈帧的创建和销毁_LILI_Plusing的博客-CSDN博客 调用函数时产生call指令跳转到函数的第一句代码的地址处即符号表中的函数弟子为函数定义中的第一句代码地址即函数如果只声明不定义就无法生成指令没有地址。
c语言中的符号表生成时按照函数名地址进行生成也就是说如果两个函数名相同则会导致符号表生成异常这就是为什么c语言不支持函数重载。 但是c为什么支持呢
原因就是其生成的符号表不是按照函数名地址的格式而是对函数名进行一定的修饰而且有自己的修饰规则。
比如LINUX下 函数名修饰为_Z4funcid 这里的修饰规则就是_Z函数名所占字节数函数名参数类型的首字母
这就是为什么函数名相同但是函数参数参数类型和类型顺序不同就可以实现重载的原因。
最后一个问题因为函数名修饰规则与函数的返回类型无关所以如果只有返回类型不同也不能实现函数重载。