重载函数
含义:
c语言中,函数如果重名会报错。
c++则引入了函数重载。编译器将所有同名函数作为候选者,精确匹配实参、通过默认参数匹配实参、通过默认类型转换匹配实参等等,寻找到正确的函数;如果匹配到不唯一或匹配不到,则编译错误。
本质:
通过编译后生成的obj文件进行分析,可以看到同名函数在符号表中有不同的标识符,也就是说本质上重载函数是不同的函数。
重载的条件:
1.参数个数不同
2.参数类型不同
3.参数顺序不同
(另外,注意函数返回值“不”作为匹配的依据)
举例:
int func(int a, char *b)
{
return 0;
}
int func(char *b, int a)
{
return 1;
}
int main(void)
{
func(1,"123"); //调用上一个函数
func("123",1); //调用下一个函数
}
注意:
当默认参数遇上重载参数可能会出现错误,编译不通过。如:
int func(int a,int b, int c=0)
{
}
int func(int a, int b)
{
}
void main(void)
{
func(1,2); //这里编译会提示重载函数模糊,即不知调用哪个函数
}
重载函数与指针
上面说过,函数重载的条件有:函数返回值“不”作为匹配的依据。
但是当重载函数赋值给指针时,函数返回值也作为匹配的依据了(即需要根据指针的返回值类型和参数类型进行匹配,找到正确的重载函数。)。因为c++是强类型语言,当使用指针的时候任何类型都需要严格匹配。
举例1:
int func(int a) {}
int func(char *a) {}
char func(int a) {}
typedef int (*pFUNC)(int a);
void main(void)
{
pFUNC p = func; //这里p指针获得的为第一个函数的地址。
/* 打印重载函数的地址 */
printf("%p\n", func); //错误,因为没有上下文,不知道是哪一个重载函数
printf("%p\n", (int(*)(int))func); //打印的是第一个重载函数的地址
printf("%p\n", (char(*)(int))func); //打印的是第三个重载函数的地址
}