面试题答案
一键面试C++函数重载规则
- 函数签名构成要素:
- 函数名:相同函数名是函数重载的基础,不同重载函数通过参数列表来区分。
- 参数列表:包括参数的个数、参数的类型以及参数的顺序。只要这三者中任意一个不同,就构成不同的函数签名。例如:
void func(int a);
void func(int a, double b);
void func(double a, int b);
这里第一个函数只有一个int
类型参数,第二个函数有一个int
类型和一个double
类型参数,第三个函数虽然参数类型和第二个一样,但顺序不同,它们都是不同的函数签名。注意,函数返回类型不属于函数签名的构成要素,不能仅通过返回类型不同来进行函数重载。例如:
// 以下代码无法编译,因为仅返回类型不同,不是合法的函数重载
int func(int a);
double func(int a);
- 重载函数时易出错地方及举例:
- 忽视参数顺序:在重载函数时,容易混淆参数顺序导致错误。例如:
#include <iostream>
void print(int a, double b) {
std::cout << "int, double: " << a << " " << b << std::endl;
}
void print(double b, int a) {
std::cout << "double, int: " << b << " " << a << std::endl;
}
int main() {
print(1, 2.5); // 调用print(int a, double b)
print(2.5, 1); // 调用print(double b, int a)
return 0;
}
如果在调用时不注意参数顺序,可能会导致调用错误的函数。
- 函数默认参数问题:当函数有默认参数时,可能与其他重载函数产生混淆。例如:
#include <iostream>
void func(int a) {
std::cout << "func(int a): " << a << std::endl;
}
void func(int a, int b = 0) {
std::cout << "func(int a, int b = 0): " << a << " " << b << std::endl;
}
int main() {
func(1); // 这里会产生二义性,编译器不知道调用哪个函数
return 0;
}
上述代码中,调用func(1)
时,编译器无法确定是调用func(int a)
还是func(int a, int b = 0)
,这就会导致编译错误。为避免这种情况,在设计重载函数和默认参数时要仔细考虑,尽量避免这种模糊的情况。