C++中的函数重载
用同一个函数名定义不同的函数
当函数名和不同的参数搭配时函数意义不同
/*
测试代码
*/
#include <stdio.h>
#include <string.h>
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("D.T.Software")); // 12
return 0;
}
运行结果
3
9
12
函数重载至少满足下面的一个条件
参数个数不同
参数类型不同
参数顺序不同
编译器调用重载函数的准则
将所有同名函数作为候选者
尝试寻找可行的候选函数
精确匹配实参
通过默认参数能够匹配实参
通过默认类型转换匹配实参
匹配失败
最终寻找到的候选函数不唯一, 则出现二义性, 匹配失败
无法匹配所有候选者, 函数未定义, 编译失败
函数重载的注意事项
函数重载是由函数名和参数列表决定的
函数重载在本质上是相互独立的不同函数
重载函数的函数类型不同
函数返回值不能作为函数重载的依据
函数重载必然发生在同一作用域中
编译器需要用参数列表或函数类型进行函数选择
无法直接通过函数名得到重载函数的入口地址
/*
测试代码
*/
#include <stdio.h>
int add(int a, int b) // int(int, int)
{
return a + b;
}
int add(int a, int b, int c) // int(int, int, int)
{
return a + b + c;
}
int main()
{
printf("%p\n", (int(*)(int, int))add);
printf("%p\n", (int(*)(int, int, int))add);
return 0;
}
运行结果
004013B0
004013BE
函数重载和函数指针
将重载函数名赋值给函数指针时
根据重载规则挑选与函数指针参数列表一致的候选者
严格匹配候选者的函数类型与函数指针的函数类型
/*
测试代码
*/
#include <stdio.h>
#include <string.h>
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(1);
printf("c = %d\n", c);
return 0;
}