本系列 C++ 相关文章 仅为笔者学习笔记记录,用自己的理解记录学习!C++ 学习系列将分为三个阶段:基础篇、STL 篇、高阶数据结构与算法篇,相关重点内容如下:
- 基础篇:类与对象(涉及C++的三大特性等);
- STL 篇:学习使用 C++ 提供的 STL 相关库;
- 高阶数据结构与算法篇: 手动实现自己的 STL 库 及 设计实现高阶数据结构,如 B树、B+树、红黑树等。
学习集:
本期内容:C++ 函数重载
目录:
1. 函数重载的认识
2. 函数重载示例
3. 函数重载的注意点说明
4. C++支持函数重载的原理
5. 补充:编译器内函数重载提示
【 C++学习合集链接 】
函数重载:是函数的一种特殊情况,C++ 中允许再同一个作用域中声明几个功能相似的同名函数!这些函数的区别在于:形参列表不同!【 参数个数!参数类型!类型顺序!不同!!! 】
问题引入:若要求实现任意两个同类型值加和并返回结果。
以 int 类型为例:
C 语言中,我们会有如下设计及实现!
int sum(int a, int b){
return a+b;
}
若此时还要实现其他类型值的加和,我们就需要对 sum 函数名进行一定的标识,以防函数名相同引发错误!(多个函数不同命名,但功能相同,显得十分麻烦)
C++ 中的函数重载完美实现了对该种情况的解决!如下是 C++ 下设计实现的函数!使用一个函数名即可(参数列表不同)
int sum(int a, int b){
return a+b;
}
float sum(float a, float b){
return a+b;
}
double sum(double a, double b){
return a+b;
}
- 从对函数重载的概念中可知,重载的关键区别在于形参列表不同!与函数返回值类型无关!
- 关于调用:编译器会根据传递的参数进行自动匹配选择!
- 形参列表不同在于:参数个数、参数类型、参数类型顺序不同!【 与形参名无关! 】(注意如下代码示例)
/* 形参列表的不同:与形参名无关! */
void test(int a, int b);
void test(int b, int a); /* 错误:不构成重载! */
/* 形参列表:参数个数不同构成重载 */
void test(int, int, int); /* 正确! */
/* 形参列表:个数相同,类型不同:构成重载 */
void test(int, float); /* 正确! */
/* 形参列表:个数相同,类型顺序不同:构成重载 */
void test(float, int);
/* 返回值类型不同,不构成重载! */
int test(int, int); /* 错误! */
此处仅作简单的分析!
代码源文件运行起来需要经历以下几个阶段:
- 预处理、编译、汇编、链接
函数重载这种问题是在链接时会有体现,当函数被调用时,编译器会去查找对应的函数名并进行调用(编译阶段会被用特定的函数名修饰方式进行修饰(C语言函数没有)!)。
函数名的修饰方式有很多,一般而言,修饰以后会用修饰名的后几位来体现函数形参列表的参数类型情况!但是 C 语言中没有,C语言中是直接存储原函数函数名作为查询标识!故 C 语言不支持重载。
【 以下是在 vs 编译器下进行的测试!通过查看反汇编码来查看函数调用时的函数标识 】