问题:
在多数情况下,我们容易确定某次调用应该选用哪个重载函数。然而,当几个重载函数的形参数量相等或某些形参的类型可由其他类型转化而来时,这项工作就不那么容易了。
示例1:
int main()
{
void f(int);
void f(double, double b = 1.0);
f(1);
f(1.0);
}
void f(int n)
{
cout << "第一个函数被调用" << endl;
}
void f(double a, double b = 1.0)
{
cout << "第二个函数被调用" << endl;
}
运行结果1:
这里,每次将其中一个重载函数注释掉。
示例2:
int main()
{
//void f(int); // 注释掉第一个函数
void f(double, double b = 1.0);
f(1);
f(1.0);
}
运行结果2:
示例3:
int main()
{
void f(int);
//void f(double, double b = 1.0); // 注释掉第二个函数
f(1);
f(1.0);
}
运行结果3:
示例4:
int main()
{
void f(int);
void f(short); // 增加一个short类型的参数的函数
//void f(double, double b = 1.0);
f(1);
f(1.0);
}
运行结果4:
结论:
从这三个示例可以看出,C++编译器会优先选择与本次调用最匹配的函数。而当参数数量相同,参数类型不同,但是该参数类型可以由其他类型转换而来时,编译器会对实参进行类型转换,然后进行函数匹配。
但是,当存在多个可以进行类型转换的匹配函数时,则会出现对重载函数调用不明确的问题。