面试题答案
一键面试使用误区
- 混淆默认参数与重载函数匹配:当调用函数时,编译器会优先匹配参数列表完全一致的重载函数,如果不存在这样的函数,才会考虑使用默认参数的函数。这可能导致开发者以为会优先使用默认参数,而实际调用的是其他重载函数。
- 二义性问题:默认参数可能会与某些重载函数组合产生二义性,使得编译器无法确定应该调用哪个函数。
举例说明
#include <iostream>
// 函数1:有默认参数
void func(int a, int b = 10) {
std::cout << "func(int a, int b = " << b << ") called, a = " << a << std::endl;
}
// 函数2:重载函数
void func(int a) {
std::cout << "func(int a) called, a = " << a << std::endl;
}
int main() {
func(5); // 调用func(int a),而非func(int a, int b = 10)
// 如果同时存在func(int a, int b)的重载,下面调用会产生二义性
// func(5, 20); // 编译器无法确定调用func(int a, int b)还是func(int a, int b = 10)
return 0;
}
在上述代码中,func(5)
调用的是 func(int a)
这个重载函数,而不是使用默认参数的 func(int a, int b = 10)
。如果再添加 func(int a, int b)
的重载,func(5, 20)
的调用就会产生二义性。