具有初始化参数的函数定义和具有较少参数的函数调用

Function definition with initialized arguments and Function call with less arguments

我在考试中遇到了一个令人困惑的问题。请帮助我理解这个概念。代码片段包括在这里:

void xyz(int a = 0, int b, int c = 0)
{
    cout << a << b << c;
}

现在的问题是以下哪些调用是非法的?

(假设h和g声明为整数)

(a) xyz();    (b) xyz(h,h);

(c) xyz(h);    (d) xyz(g,g);

代码:

(1) (a) 和 (c) 是正确的 (2) (b) 和 (d) 是正确的

(3) (a) 和 (b) 是正确的 (4) (b) 和 (c) 是正确的

我尝试用 C++ 编译代码,但出现此错误:

error:expected ';',',' or ')' before '=' token
void xyz (int a = 0, int b = 0, int c = 0)

帮我理解这个概念。

根据cppreference

In a function declaration, after a parameter with a default argument, all subsequent parameters must :

  • have a default argument supplied in this or a previous declaration; or
  • be a function parameter pack.

表示

void xyz(int a = 0, int b, int c = 0) // Not valid
{
   //your code
}

报错,因为a有默认值,但b之后 没有默认值。带有默认参数的函数声明的顺序必须从右到左

所以,使用

void xyz(int a = 0, int b=0, int c = 0) // Not valid
{
   //your code
}

让我们看一些 C++ 示例:

案例 1:有效,尾随默认值

void xyz(int a, int b = 2, int c = 3)
{
   //your code
}

案例 2:无效,前导默认值

void xyz(int a = 1, int b = 2, int c)
{
      //Your code
}

情况3:无效,默认在中间

void xyz(int a, int b = 3, int c);  
{
      //Your code
}

我认为这是函数的错误定义。

void xyz(int b, int a = 0,  int c = 0)

void xyz(int a = 0, int b = 0,  int c = 0)

应该没问题。

将默认分配放在右边。

void xyz(int a , int b= 0, int c = 0)
{
    count <<a<<b<<c;
} 

这样称呼它:

xyz(2,3); 
xyz(2,3,5);