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

时间:2017-10-09 06:42:53

标签: c++ default-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 ++编译代码,我收到了这个错误:

  

错误:预期&#39;;&#39;,&#39;,&#39;或者&#39;)&#39;之前&#39; =&#39;令牌
  void xyz(int a = 0,int b = 0,int c = 0)

帮助我理解这个概念。

3 个答案:

答案 0 :(得分:9)

根据cppreference

  

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

     
      
  • 在此声明或先前声明中提供默认参数;或
  •   
  • 是一个功能参数包。
  •   

意味着

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 }  没有默认值。带有默认参数的函数声明的顺序必须来自从右到左

所以,使用

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

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

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

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

案例2: 无效,领先默认

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

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

DELETE

答案 1 :(得分:2)

将默认分配放在右边。

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

这样称呼:

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

答案 2 :(得分:1)

我认为这个功能的定义是错误的。

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

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

可以。