当函数重载遇到函数默认值、函数指针
一、当函数重载遇到函数默认值:
当我们的重载函数遇到函数有默认值的情况,编译器还能不能正确的做出合理的判断,下面我们通过实验来给出答案,下面是两个非常简单的重载函数,但跟普通的重载不同的是我们的第二个函数的参数列表给出了默认值:
void fun(int i, int j)
{
cout << "fun(i,j) = " << i << endl;
}
void fun(int i, int j , int k = 0)
{
cout << "fun(i,j,k) = " << i << endl;
}
紧接着是我们的main函数:
int main(void)
{
//fun(1, 2);
fun(1, 2, 3);
cout << "Please input any key to continue... ..." << endl;
getchar();
return 0;
}
1、当我们第一次调用fun(1,2)的时候,编译器直接报错,报错信息如下图:
编译器明确指出了当执行该调用的时候,我们的编译器发现上面的两个重载函数都是可以符合条件的可调用函数,产生二义性,这时候我们的编译器就不知道具体要调用哪一个函数,所以这时候编译会出错!
2、当我们第二次调用fun(1,2,3)的时候,编译成功,并正确执行,执行信息如下图:
结果显示,第二次调用重载函数编译器能够具体到哪个重载函数,从而正确执行!
3、应对方法:当我们在编写程序代码的时候,尽量避免这种二义性的代码编写方式!
二、当函数重载遇到函数指针:
首先我们定义了自己的重载函数,同时也定义了自己的函数指针,当我们将函数指针与重载函数建立起了联系并通过函数指针来调用重载函数的时候,会发生怎样的情况,下面我们将通过实验来给出答案:
首先我们定义两个重载函数,并声明一个函数指针:
void myfunc( int a, int b)
{
cout<<"this is myfunc(int a, int b)"<<endl;
}
void myfunc( double a, double b)
{
cout<<"this is myfunc(double a, double b)"<<endl;
}
typedef void (*myFunPtr)(double a, double b);
紧接着使我们的main函数:
int main()
{
myFunPtr ptr = NULL;
ptr = myfunc;//在这里大家可能会疑问,通过函数指针调用的函数没有参数列表怎么发生重载的呢?
ptr( 1.0, 2.0);//其实函数重载在这里才会真正的发生,由于函数指针本身就有确定的类型,所以这里会执行严格的类型检查;
printf("Press any key to continue... ...");
getchar();
return 0;
}
1、编译并执行看结果如下图:
从运行结果看出,编译器正确找到了具体的重载函数并执行,这是因为函数指针自己本身就有确定的类型,在调用的时候会执行严格的类型检查;
总结:当使用重载函数名给函数指针进行赋值操作时,根据重载规则挑选与函数指针参数列表一致的候选者,严格匹配候选者的函数类型与函数指针的函数类型!
以上是简单介绍写代码过程中当函数重载遇到默认函数参数或者函数重载遇到函数指针时候的情况,希望对大家有帮助!——Powered By Anonymous–V.