在C++中,当你定义一个函数时,可以为参数提供默认值。当你调用这个函数时,如果某个带有默认值的参数没有被明确提供值,那么该参数就会使用其默认值。
对于你给出的函数定义:
void func(int a, string b = "ext");
这个函数有两个参数:a 是一个 int 类型的参数,没有默认值;b 是一个 string 类型的参数,默认值为 "ext"。
当你调用这个函数时,如果你只提供一个参数(假设这个参数与 a 的类型匹配),那么 b 将自动使用其默认值 "ext"。因此,对于你的函数 func,调用 func(2) 是完全合法的,并且在这种情况下,a 将被设置为 2,而 b 将使用其默认值 "ext"。
所以,你可以写成 func(2),并且这样调用时,b 参数默认是 "ext"。
在C++中,当你为同一个函数名提供多个重载版本时,编译器会根据调用时提供的参数类型和数量来选择最合适的函数进行调用。这个过程称为函数重载解析(Overload Resolution)。
对于你给出的两个函数:
void func(int a, string b = "ext");
void func(int a);
当你调用 func(3) 时,编译器会寻找一个与调用参数完全匹配的函数。在这个例子中,有两个函数都可以接受一个 int 类型的参数,但是:
第一个函数 void func(int a, string b = "ext") 虽然可以接受一个 int 类型的参数(a),但它还期望第二个参数(b),即使这个参数有默认值。然而,在重载解析中,编译器不会仅仅因为某个参数有默认值就忽略它。
第二个函数 void func(int a) 正好匹配一个 int 类型的参数,没有额外的参数或默认参数。
因此,当调用 func(3) 时,编译器会选择与调用参数完全匹配的那个函数,即 void func(int a)。
总结来说,调用 func(3) 时会调用 void func(int a) 这个函数,因为它与调用参数完全匹配,而不需要考虑任何默认参数。