MST
星途 面试题库

面试题:C++函数重载的规则及注意事项

请详细阐述C++函数重载的规则,包括函数签名的构成要素,以及在重载函数时需要注意哪些容易出错的地方?并举例说明。
30.9万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

C++函数重载规则

  1. 函数签名构成要素
    • 函数名:相同函数名是函数重载的基础,不同重载函数通过参数列表来区分。
    • 参数列表:包括参数的个数、参数的类型以及参数的顺序。只要这三者中任意一个不同,就构成不同的函数签名。例如:
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); 
  1. 重载函数时易出错地方及举例
    • 忽视参数顺序:在重载函数时,容易混淆参数顺序导致错误。例如:
#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),这就会导致编译错误。为避免这种情况,在设计重载函数和默认参数时要仔细考虑,尽量避免这种模糊的情况。