面试题答案
一键面试可能遇到的问题
- 二义性问题:当调用
func
函数时,如果传入的参数类型既可以隐式转换为int
又可以隐式转换为double
,编译器将无法确定应该调用哪个func
函数,从而产生二义性错误。例如:
func(5.5);
这里5.5
可以转换为double
调用func(double c, int d = 20);
,也可以转换为int
调用func(int a, int b = 10);
,编译器无法判断。
避免问题的方法
- 明确参数类型:在调用函数时,确保传入的参数类型明确匹配其中一个函数的参数类型,避免隐式类型转换导致的二义性。例如:
func(5); // 明确调用func(int a, int b = 10);
func(5.5, 30); // 明确调用func(double c, int d = 20);
- 使用函数重载解析规则:了解C++函数重载解析规则,尽量使函数参数类型差异明显,减少隐式转换可能带来的二义性。例如,改变其中一个函数的参数个数或类型,让编译器能够根据参数的数量或类型准确选择函数。
// 修改后的函数定义,减少二义性
void func(int a, int b = 10);
void func(double c, double d = 20.0);
这样在调用时,编译器能更清晰地根据参数类型选择合适的函数。