在C++中,函数重载一直是一个常用且重要的东西,但其中也是有很多坑。
编译器怎么对待函数重载
实际上,在g++处理函数重载的时候,假设有下面两个函数
void fun(int a,int b)
{
//...
}
void fun(int a,char b)
{
//...
}
很明显这是两个重载的函数,C++利用一种叫name mangling的技术,经过编译器处理后,实际上是产生了两个函数,比如分别是fun_ii(),fun_ic()两个函数,也就是在实际经过编译器后,他最终产生的仍然是多个函数,再根据调用时传入的参数列表进行选择,因此,由于编译器的这种处理方法,在实际使用过程中就产生了很多坑。
不要有默认参数
void fun(int a,int b,int c = 100)
{
//...
}
void fun(int a,int b)
{
//...
}
比如这样的处理方式就不可取,因为编译器在分析的时候会产生歧义,因而我们在重载函数的时候不要带默认参数。
函数的返回值
在c++中,函数的返回值是不构成函数重载的条件的,因此返回值不同不可以构成重载,我们在编译过程中,编译器就会发现并且报错
函数的重定义
那如果我想对一个已有的重载函数重定义该怎么办呢,那就需要像C一样,令函数的返回值、函数参数列表(参数的个数、参数的类型、参数的顺序)相同,即可作为函数的重定义
函数指针
我们在上面提到,编译器对待函数重载是 将其产生多个函数,因此我们在利用函数指针的时候就要注意,函数指针定义时的参数列表不同,是不能够匹配的
int func(int,int,int);
int func(int,int);
int(*fp)(int,int)=NULL;
fp = func;//指向int func(int,int)
比如上述的函数指针fp,我们在使用他的过程中,就只能传入两个参数,因为在经过编译器处理后,它实际指向的就是int func(int,int),如果传入三个参数,就会报错参数太多,也就是函数指针并不进行匹配,因此在使用函数指针时要注意他指向了那个函数。