MST

星途 面试题库

面试题:C++函数重载匹配规则之高级题

假设有如下C++ 代码: ```cpp #include <iostream> void func(int a, int b = 10) { std::cout << "func(int, int) with default arg" << std::endl; } void func(double a, double b) { std::cout << "func(double, double)" << std::endl; } void func(int a, double b) { std::cout << "func(int, double)" << std::endl; } int main() { func(5); func(5, 6.5); func(5.5, 6.5); return 0; } ``` 详细说明每一次函数调用是如何依据C++函数重载匹配规则找到最合适的函数版本的。如果存在模糊匹配的情况,应如何解决?
26.7万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. func(5);

    • 首先,编译器会查找参数完全匹配的函数。对于func(5);,实参是一个int类型。
    • 有两个函数void func(int a, int b = 10)void func(int a, double b)都接受int类型的第一个参数。
    • 对于void func(int a, int b = 10),它有一个默认参数,可以在只提供一个int参数时匹配。
    • void func(int a, double b)需要两个参数,在只有一个参数时无法匹配。
    • 所以,func(5);会调用void func(int a, int b = 10)函数。
  2. func(5, 6.5);

    • 这里有两个实参,第一个是int类型,第二个是double类型。
    • 函数void func(int a, double b)完全匹配这个参数列表,因为它的第一个参数类型是int,第二个参数类型是double
    • 函数void func(int a, int b = 10)第二个参数类型不匹配(需要int,传入的是double)。
    • 函数void func(double a, double b)第一个参数类型不匹配(需要double,传入的是int)。
    • 所以,func(5, 6.5);会调用void func(int, double)函数。
  3. func(5.5, 6.5);

    • 两个实参都是double类型。
    • 函数void func(double a, double b)完全匹配这个参数列表。
    • 函数void func(int a, double b)第一个参数类型不匹配(需要int,传入的是double)。
    • 函数void func(int a, int b = 10)两个参数类型都不匹配。
    • 所以,func(5.5, 6.5);会调用void func(double, double)函数。

模糊匹配情况及解决办法

如果存在模糊匹配,比如有两个函数void func(int a, double b)void func(double a, int b),当调用func(5.5, 6);时,编译器无法明确选择哪个函数,就会产生模糊匹配错误。解决办法如下:

  • 显式类型转换:调用者可以进行显式类型转换,例如func(static_cast<double>(5), 6);就会调用void func(double a, int b)
  • 命名空间限定:如果函数在不同命名空间,可以通过命名空间限定来明确调用哪个函数,比如namespace1::func(5.5, 6);
  • 修改函数参数类型:调整函数参数类型,避免模糊匹配的可能,比如将其中一个函数改为void func(float a, int b)