## 一.概述
1. **重载** 在不同类型上做类似运算而又用相同名字的情况称为重载。
2. **重载解析** C++用一种函数命名技术可以准确判断应该调用哪个重载函数。
3. **重载依据** 返回类型、形参类型、形参个数、形参次序。
>[danger] 注意
>
>1. 返回类型不能作为单独重载解析的依据。
>2. 不能用typedef定义的类型名来区分重载函数声明中的参数。
4. **匹配顺序(简版)** 类型完全一致 -> 自动类型转换 -> 用户定义的转换。
```c++
//若有函数原型
void fun(int);
void fun(double);
//调用函数
fun(1); //匹配void fun(int);
fun(1.0); //匹配void fun(double);
fun('a'); //匹配void fun(int);
fun(3.14f); //匹配void fun(double);
```
## [$]二.实参匹配顺序
1. 精确匹配:
+ 类型完全相同。
+ 左值到右值的转换。
+ 数组转换成指针以及函数转换成函数指针。
2. 向参数添加 `const` 限定符或者从实参中删除 `const` 限定符。
3. **常量转换** 指向变量的指针或引用转换成指向常量的指针或引用。
4. **类型提升** 整型提升和浮点提升。
5. **其他的算术转换、指针转换、布尔转换** 等隐式转换。
6. 用户定义的转换
## [$]三.函数重载与域
>[info]重载函数集合中的全部函数都应在同一个域中声明。
1. 一个声明为局部的函数将隐藏而不是重载一个全局域中声明的函数。
```c++
void print(const char*);
void print(double d);
int MyFunc()
{
void print(int i);
print("Hello World");//错了!void print(const char*);声明被隐藏了
return 0;
}
```
2. 两个不同类的成员函数不能相互重载,为不同名字空间成员的函数不能相互重载。
3. 用 `using` 关键字声明函数时会把所有的重载函数引入作用域。
4. 用 `using` 关键字引入一个同名的函数时,相当于重载了这个同名函数。
>[danger]如果 `using` 声明向一个域中引入了一个函数,而该域中已经有同名函数且具有相同的参数表,则该 using 声明就是错误的。
```c++
namespace demo {
void print(const char*);
void print(double);
void print(int);
}
void print(int,int);
using demo::print;
int MyFunc()
{
print(2020);//OK,demo::print(int)
print(2020,2019);//OK,print(int,int)
return 0;
}
```
## [$]四.函数重载解析
```c++
//演示代码
void print(const char* string);
void print(double d);
void print(int i);
void print(int i,int j);
int main()
{
print(2020);//<-探讨该语句的解析过程
return 0;
}
```
1. 确定函数调用考虑的重载函数的集合,确定函数调用中实参表的属性。
>`void print(const char* string);`
>`void print(double d);`
>`void print(int i);`
>`void print(int i,int j);`
2. 从重载函数集合中选择函数,该函数可以在(给出实参个数和类型的)情况下用调用中指定的实参进行调用。
+ **可行函数** 选出来的函数。
+ **参数够** 可行函数的参数个数与调用的实参表中的参数数目相同,或者可行函数的参数个数多一些,但是每个多出来的参数都要有默认值。
+ **可转换** 对于每个可行函数,调用中的实参与该函数的对应的参数类型之间必须可以进行隐式类型转换。
+ **无匹配情况** 没有函数与调用匹配。这个调用就是错的。
>`void print(int i);` **可行** **精确匹配**
>`void print(double d);` **可行** **转换后匹配**
3. 选择与调用最匹配的函数。
+ 从实参类型到相应可行函数参数所用的转换都被划分等级。
+ **最佳匹配函数** 在实参的转换上不能比别的同名函数差,而且某些实参的转换要比别的同名函数好。
>`void print(int i);` **最佳匹配函数√** 精确匹配优于转换后匹配
>如果还没找到,那么你调用的东西是二义的。
- 阅读说明
- 1.1 概述
- C++基础
- 1.2 变量与常量
- 1.2.1 变量
- 1.2.2 字面值常量
- 字符型常量
- 数值型常量
- 1.2.3 cv限定符
- 1.3 作用域
- 1.3.1 标识符
- 1.3.2 *命名空间
- 1.3.3 作用域
- 1.3.4 可见性
- 1.4 数据类型
- 1.4.1 概述
- 1.4.2 处理类型
- 类型别名
- * auto说明符
- * decltype说明符
- 1.4.3 数组
- 1.4.4 指针
- 1.4.5 引用
- 1.5 表达式
- 1.5.1 概述
- 1.5.2 值的类别
- 1.5.3 *初始化
- 1.5.4 运算符
- 算术运算符
- 逻辑和关系运算符
- 赋值运算符
- 递增递减运算符
- 成员访问运算符
- 位运算符
- 其他运算符
- 1.5.5 *常量表达式
- 1.5.6 类型转换
- 第2章 面向过程编程
- 2.1 流程语句
- 2.1.1 条件语句
- 2.1.2 循环语句
- 2.1.3 跳转语句
- 2.1.4 *异常处理
- 2.2 函数
- 2.2.1 概述
- 2.2.2 函数参数
- 2.2.3 内置函数
- 2.2.4 函数重载
- 2.2.5 * 匿名函数
- 2.3 存储和生命期
- 2.3.1 生命周期与存储区域
- 2.3.2 动态内存
- 2.4 *预处理命令
- 第3章 面向对象编程
- 3.1 概述
- 3.2 类和对象
- 3.3 成员
- 3.3.1 访问限制
- 3.3.2 常成员
- 3.3.3 静态成员
- 3.3.4 成员指针
- 3.3.5 this指针
- 3.4 特殊的成员函数
- 3.4.1 概述
- 3.4.2 构造函数
- 3.4.3 析构函数
- 3.4.4 拷贝语义
- 3.4.5 * 移动语义
- 3.5 友元
- 3.6 运算符重载与类型转换
- 3.6.1 概述
- 3.6.2 重载方法
- 3.6.3 类型转换
- 3.7 继承与多态性
- 3.7.1 概述
- 3.7.2 派生类
- 3.7.3 子类型
- 3.7.4 虚基类
- 3.7.5 虚函数
- 3.7.6 抽象类
- 3.8 模板与泛型
- 3.8.1 概述
- 3.8.2 模板类型
- 3.8.3 *模板参数
- 3.8.4 *模板编译
- 3.8.5 *模板推断
- 3.8.6 *实例化与特例化
- 第4章 C++标准库
- 4.1 概述
- 4.2 输入输出流
- 4.2.1 概述
- 4.2.2 *流的状态
- 4.2.3 *常用流
- 4.2.4 *格式化I/O
- 4.2.5 *低级I/O
- 4.2.6 *随机访问
- 4.3 *C输入输出
- 4.3.1 *字符输入输出
- 4.3.2 *格式化输入输出
- 4.4 * 容器
- 4.4.1 * 概述
- 4.4.2 * 基本操作
- 4.4.3 * 顺序容器
- 4.4.4 * 迭代器
- 4.4.5 * 容器适配器
- 4.5 * 泛型算法
- 4.6 * 内存管理
- 4.6.1 * 自动指针
- 4.7 * 其他设施