面试题答案
一键面试函数重载的规则
- 参数列表不同:
- 参数个数不同:例如
void func(int a);
和void func(int a, int b);
,这两个函数由于参数个数不同构成重载。 - 参数类型不同:比如
void func(int a);
和void func(double a);
,因为参数类型不同形成重载。 - 参数顺序不同:像
void func(int a, double b);
和void func(double a, int b);
,参数顺序不一样构成重载。
- 参数个数不同:例如
- 返回类型:函数重载与返回类型无关。仅返回类型不同,而参数列表完全相同的函数,在C++中不构成重载,会导致编译错误。例如:
int func(int a);
double func(int a); // 错误,不构成重载
- 作用域:重载函数必须在相同的作用域内。例如,在类中定义的成员函数的重载必须都在该类的作用域内。
函数既有重载形式又有默认参数的潜在问题
- 二义性问题:当函数既有重载形式又有默认参数时,可能会导致调用的二义性。例如:
#include <iostream>
void func(int a, int b = 10) {
std::cout << "func(int a, int b = 10): a = " << a << ", b = " << b << std::endl;
}
void func(int a) {
std::cout << "func(int a): a = " << a << std::endl;
}
int main() {
func(5); // 这里会产生二义性,编译器不知道该调用哪个函数
return 0;
}
在上述代码中,func(5)
既可以匹配func(int a)
,也可以匹配func(int a, int b = 10)
,从而导致编译错误。因为编译器无法确定应该调用哪个函数。这种二义性问题在实际编程中需要避免,通常的解决办法是调整函数定义,使其参数列表更具区分度,避免可能的混淆。