C++中函数重载详解

C++中函数重载详解 函数重载:是函数的一种特殊情况C允许在同一作用域中声明几个功能类似的同名函数这些同名函数的 形参列表(参数个数 或 类型 或 顺序)必须不同常用来处理实现功能类似数据类型不同的问题。函数重载的应用1.比如以下代码函数名一样而参数的类型不同在调用的时候编译器会根据传递的参数自动进行匹配。2.在例如以下代码我们进行编译都可以编译成功。3.接下来看一个有趣的现象将上述第二个例子中的第一个函数的最后一个参数改为缺省参数此时调用f(1,2),编译器直接报错。其实这两个函数在语法上是构成重载的但是当调用时只给了两个参数我们知道缺省参数可以不给那么此时编译器就不知道调用哪个函数了就出现了“调用不明确”的错误。为什么C支持函数重载而C语言不支持在 C/C 中一个程序要运行起来需要经历以下几个阶段预处理、编译、汇编、链接。1. 实际我们的项目通常是由多个头文件和多个源文件构成而通过我们 C 语言阶段学习的编译链接我们 可以知道【当前a.cpp 中调用了 b.cpp 中定义的 Add 函数时】编译后链接前 a.o 的目标文件中没有 Add的函数地址因为 Add 是在 b.cpp 中定义的所以 Add 的地址在 b.o 中。那么怎么办呢 2. 所以链接阶段就是专门处理这种问题链接器看到a.o调用Add但是没有Add的地址就会到b.o的符号表中找Add的地址然后链接到一起。3. 那么链接时面对 Add 函数连接器会使用哪个名字去找呢这里每个编译器都有自己的函数名修饰规 则。 4. 由于 Windows 下 vs 的修饰规则过于复杂而 Linux 下 gcc 的修饰规则简单易懂下面我们使用了 gcc 演示了这个修饰后的名字。 5.通过下面我们可以看出gcc的函数修饰后名字不变。而g的函数修饰后变成【_Z函数长度函数名类型首字母】。一、在Linux环境下采用C语言编译器编译后函数名字的修饰没有发生改变。二、采用C编译器编译后函数名字的修饰发生改变编译器将函数参数类型信息添加到修改后的名字中。通过这里就理解了C语言没办法支持重载因为同名函数没办法区分。而C是通过函数修饰规则来区分只要参数不同修饰出来的名字就不一样就支持了重载。到此这篇关于C中函数重载详解的文章就介绍到这了