重载:同一个标识符在不同的上下文有不同的意义。重载是C语言与C++之间质的区别,C语言中所有的函数名都不允许同名,也就是说在C语言中函数名是区分不同函数的标识,但是在C++中可不是这么玩的,在C++中同一个函数名,可以表示不同的函数。
在生活中常常有这种情况,同一个字,在不同的场景,表达的意思是不一样的,比如:
明:明亮的明,与明天的明
洗:洗脑的洗,与洗衣服的洗
可:可爱的可,与可是的可
以下三个条件,只要满足其中的一个就表示重载函数:
1、函数的参数个数不同;
2、函数参数的类型不同;
3、函数参数的顺序不同
程序实例1:函数名与不同的参数搭配时,函数的含义是不一样的,表示不同的函数
#include
#include
int func(int x)
{
return x;
}
int func(int a, int b)
{
return a + b;
}
int func(const char* s)
{
return strlen(s);
}
int main()
{
printf("%d\n", func(3)); //输出3
printf("%d\n", func(4,5));//输出9
printf("%d\n", func("helloworld!"));//输出11
return 0;
}
1、将所有同名函数作为候选项;
2、尝试寻找可行的候选参数
精确匹配实参
通过默认参数能够匹配实参
通过默认类型转换匹配实参
3、匹配失败的情况
最终的候选函数有两个及以上,就编译失败;
没有候选函数,编译失败。
1、函数重载是由函数名和参数列表决定的
2、重载函数本质上是相互独立的不同函数;
3、重载函数的函数类型是不一样的;
4、函数的返回值不能作为函数重载的依据
程序实例2:函数重载的本质分析
#include
#include
//函数类型:int(int, int, int)
int add(int a, int b, int c)
{
return a + b + c;
}
//函数类型:int(int,int)
int add(int a, int b)
{
return a + b;
}
int main()
{
printf("%d\n", add(1, 2)); //调用int add(int a, int b)
printf("%p\n",(int(*)(int, int))add);//打印函数的入口地址
printf("\n");
printf("%d\n", add(1, 2, 3));//调用int add(int a, int b, int c)
printf("%p\n", (int(*)(int, int, int))add);//打印函数的入口地址
return 0;
}
输出结果:
3
00A513CF
6
00A513CA
从打印的函数地址来看,函数add(int a, int b, int c)与函数add(int a, int b)的地址是不一样的,表示不同的函数。
将重载函数的函数名赋值给函数指针时:
根据重载规则挑选与函数指针参数列表一致的候选者;
严格匹配候选者的函数类型和函数指针的函数类型;
程序实例3:根据函数指针的参数列表去对应重载函数
#include
#include
int func(int x)
{
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 main()
{
int c = 0;
PFUNC p = func;
c = p(2); //函数指针去匹配函数
printf("c = %d\n",c);
return 0;
}
输出结果:
c = 2
从输出的结果知道p(2),相当于调用了函数int func(int x)。