1、概念:
用同一个函数名定义不同的函数
当函数名和不同的参数搭配时函数的含义不同
2、判断标准
函数重载至少满足下面的一个条件:
参数个数不同
参数类型不同
参数顺序不同
函数返回值不是函数重载的判断标准
void func(int a); //ok
void func(char a); //ok
void func(char a,int b); //ok
void func(int a, char b); //ok
char func(int a); //与第⼀个函数有冲突
3、函数重载调用机制
编译器调用重载函数的准则
1)将所有同名函数作为候选者
2)尝试寻找可行的候选函数
3)精确匹配实参
4)通过默认参数能够匹配实参
5)通过默认类型转换匹配实参
6)匹配失败
7)最终寻找到的可行候选函数不唯一,则出现二义性,编译失败。
8)无法匹配所有候选者,函数未定义,编译失败。
函数重载的注意事项
重载函数在本质上是相互独立的不同函数(静态链编)
重载函数的函数类型是不同的
函数返回值不能作为函数重载的依据
函数重载是由函数名和参数列表决定的。
4、底层实现
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)
5、函数重载与函数指针结合
函数重载与函数指针
当使用重载函数名对函数指针进行赋值时
根据重载规则挑选与函数指针参数列表一致的候选者
严格匹配候选者的函数类型与函数指针的函数类型
/*
函数重载与函数指针
当使⽤重载函数名对函数指针进⾏赋值时
根据重载规则挑选与函数指针参数列表⼀致的候选者
严格匹配候选者的函数类型与函数指针的函数类型
*/
#include <iostream>
using namespace std;
int func(int x) // int(int a)
{
return x;
}
int func(int a, int b)
{
return a + b;
}
int func(const char* s)
{
return strlen(s);
}
typedef int(*PFUNC)(int a); // int(*)(int a)
typedef int(*PFUNC2)(int a, int b); // int(*)(int a, int b)
int main()
{
int c = 0;
PFUNC p = func;
c = p(1);
printf("c = %d\n", c);
PFUNC2 p2 = func;
c = p2(1, 2);
printf("c = %d\n", c);
return 0;
}
总结:
重载函数在本质上是相互独立的不同函数。
函数的函数类型是不同的
函数返回值不能作为函数重载的依据
函数重载是由函数名和参数列表决定的。
补充:
//⽅法⼀:
//声明⼀个函数类型
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);