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

run*_*ner 3 c++ default-arguments

考试期间我遇到了一个令人困惑的问题.请帮我理解这个概念.代码段包括:

void xyz(int a = 0, int b, int c = 0)
{
    cout << a << b << c;
}
Run Code Online (Sandbox Code Playgroud)

现在的问题是以下哪些电话是非法的?

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

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

(c) xyz(h);    (d) xyz(g,g);
Run Code Online (Sandbox Code Playgroud)

代码:

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

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

我试图用C++编译代码,我得到了这个错误:

错误:预期';',','或')'在'='之前令牌
void xyz(int a = 0,int b = 0,int c = 0)

帮助我理解这个概念.

msc*_*msc 9

根据cppreference:

在函数声明中,在带有默认参数的参数之后,所有后续参数必须:

  • 有一个在此声明或前一个声明中提供的默认参数; 要么
  • 是一个函数参数包.

手段

void xyz(int a = 0, int b, int c = 0) // Not valid
{
   //your code
}
Run Code Online (Sandbox Code Playgroud)

它有一个错误,因为它a有默认值,但是b它没有默认值.带有默认参数的函数声明的顺序必须是从右到左.

所以,使用

void xyz(int a = 0, int b=0, int c = 0) // Not valid
{
   //your code
}
Run Code Online (Sandbox Code Playgroud)

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

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

void xyz(int a, int b = 2, int c = 3)
{
   //your code
}
Run Code Online (Sandbox Code Playgroud)

案例2: 无效,领先默认值

void xyz(int a = 1, int b = 2, int c)
{
      //Your code
}
Run Code Online (Sandbox Code Playgroud)

案例3: 无效,默认为中间

void xyz(int a, int b = 3, int c);  
{
      //Your code
}
Run Code Online (Sandbox Code Playgroud)