MST
星途 面试题库

面试题:C++ 函数重载与默认参数相关问题

在C++中,函数重载的规则是什么?如果一个函数既有重载形式,又有默认参数,会产生哪些潜在问题?请举例说明。
50.3万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

函数重载的规则

  1. 参数列表不同
    • 参数个数不同:例如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);,参数顺序不一样构成重载。
  2. 返回类型:函数重载与返回类型无关。仅返回类型不同,而参数列表完全相同的函数,在C++中不构成重载,会导致编译错误。例如:
int func(int a);
double func(int a); // 错误,不构成重载
  1. 作用域:重载函数必须在相同的作用域内。例如,在类中定义的成员函数的重载必须都在该类的作用域内。

函数既有重载形式又有默认参数的潜在问题

  1. 二义性问题:当函数既有重载形式又有默认参数时,可能会导致调用的二义性。例如:
#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),从而导致编译错误。因为编译器无法确定应该调用哪个函数。这种二义性问题在实际编程中需要避免,通常的解决办法是调整函数定义,使其参数列表更具区分度,避免可能的混淆。