重载规则**
1)函数名相同。
2)参数个数不同,参数的类型不同,参数顺序不同,均可构成重载。
3)仅仅返回值类型不同则不可以构成重载
调用准则
1)严格匹配,找到则调用。
2)通过隐式转换寻求一个匹配,找到则调用。
print(1); // print(int)
print(1.1); // print(double)
print('a'); // print(int)
print(1.11f); // print(double)
编译器调用重载函数的准则
1.将所有同名函数作为候选者
2.尝试寻找可行的候选函数
3.精确匹配实参
4.通过默认参数能够匹配实参
5.通过默认类型转换匹配实参
6.匹配失败
7.最终寻找到的可行候选函数不唯一,则出现二义性,编译失败。
8.无法匹配所有候选者,函数未定义,编译失败。
重载底层实现
C++利用 name mangling(倾轧)技术,来改名函数名,区分参数不同的同名函数。
实现原理:用 v c i f l d 表示 void char int float long double 及其引用。
void func(char a); // func_c(char a)
void func(char a, int b, double c); //func_cid(char a, int b, double c)
一个函数,不能既作重载,又作默认参数的函数。当你少写一个参数时,系统
无法确认是重载还是默认参数。
函数重载和函数指针结合
函数重载与函数指针
当使⽤用重载函数名对函数指针进⾏行赋值时
根据重载规则挑选与函数指针参数列表⼀一致的候选者
严格匹配候选者的函数类型与函数指针的函数类型函数指针基本语法
//方法⼀:
//声明一个函数类型
`typedef void (myTypeFunc)(int a,int b);
//定义一个函数指针
myTypeFunc myfuncp = NULL; //定义一个函数指针 这个指针指向函数的⼊口地址
//方法二:
//声明一个函数指针类型
typedef void (myPTypeFunc)(int a,int b) ; //声明了一个指针的数据类型
//定义一个函数指针
myPTypeFunc fp = NULL; //通过函数指针类型 定义了一个函数指针
//方法三:
//定义一个函数指针变量
void (*myVarPFunc)(int a, int b);
函数重载总结
重载函数在本质上是相互独立的不同函数。
函数的函数类型是不同的
函数返回值不能作为函数重载的依据
函数重载是由函数名和参数列表决定的。