面试题答案
一键面试-
func(5);
- 首先,编译器会查找参数完全匹配的函数。对于
func(5);
,实参是一个int
类型。 - 有两个函数
void func(int a, int b = 10)
和void func(int a, double b)
都接受int
类型的第一个参数。 - 对于
void func(int a, int b = 10)
,它有一个默认参数,可以在只提供一个int
参数时匹配。 - 而
void func(int a, double b)
需要两个参数,在只有一个参数时无法匹配。 - 所以,
func(5);
会调用void func(int a, int b = 10)
函数。
- 首先,编译器会查找参数完全匹配的函数。对于
-
func(5, 6.5);
- 这里有两个实参,第一个是
int
类型,第二个是double
类型。 - 函数
void func(int a, double b)
完全匹配这个参数列表,因为它的第一个参数类型是int
,第二个参数类型是double
。 - 函数
void func(int a, int b = 10)
第二个参数类型不匹配(需要int
,传入的是double
)。 - 函数
void func(double a, double b)
第一个参数类型不匹配(需要double
,传入的是int
)。 - 所以,
func(5, 6.5);
会调用void func(int, double)
函数。
- 这里有两个实参,第一个是
-
func(5.5, 6.5);
- 两个实参都是
double
类型。 - 函数
void func(double a, double b)
完全匹配这个参数列表。 - 函数
void func(int a, double b)
第一个参数类型不匹配(需要int
,传入的是double
)。 - 函数
void func(int a, int b = 10)
两个参数类型都不匹配。 - 所以,
func(5.5, 6.5);
会调用void func(double, double)
函数。
- 两个实参都是
模糊匹配情况及解决办法
如果存在模糊匹配,比如有两个函数void func(int a, double b)
和void func(double a, int b)
,当调用func(5.5, 6);
时,编译器无法明确选择哪个函数,就会产生模糊匹配错误。解决办法如下:
- 显式类型转换:调用者可以进行显式类型转换,例如
func(static_cast<double>(5), 6);
就会调用void func(double a, int b)
。 - 命名空间限定:如果函数在不同命名空间,可以通过命名空间限定来明确调用哪个函数,比如
namespace1::func(5.5, 6);
。 - 修改函数参数类型:调整函数参数类型,避免模糊匹配的可能,比如将其中一个函数改为
void func(float a, int b)
。