函数参数的默认值

时间:2010-05-16 07:31:49

标签: c++ syntax optional-parameters

1

int Add (int a, int b = 3);
int Add (int a, int b)
{

}

2

int Add (int a, int b);
int Add (int a, int b = 3)
{

}

两者都有效;这是标准方式,为什么

5 个答案:

答案 0 :(得分:186)

如果您将声明放在头文件中,并将定义放在单独的.cpp文件中,并将#include标题放在另一个.cpp文件中,您将能够看到差异。

具体来说,假设:

lib.h

int Add(int a, int b);

lib.cpp

int Add(int a, int b = 3) {
   ...
}

TEST.CPP

#include "lib.h"

int main() {
    Add(4);
}

test.cpp的编译将看不到默认参数声明,并且会因错误而失败。

因此,默认参数定义通常在函数声明中指定:

lib.h

int Add(int a, int b = 3);

答案 1 :(得分:43)

在C ++中,对默认参数在参数列表中的位置施加的要求如下:

  1. 必须指定给定参数的默认参数不超过一次。多次指定它(即使使用相同的默认值)也是非法的。

  2. 带有默认参数的参数必须在参数列表的末尾形成一个连续的组。

  3. 现在,记住这一点,只要连续满足上述要求,就可以在C ++中“增长”具有默认参数的参数集,从一个函数声明到下一个声明。

    例如,您可以声明一个没有默认参数的函数

    void foo(int a, int b);
    

    为了在声明之后调用该函数,您必须明确指定两个参数。

    稍后(进一步向下)在同一翻译单元中,您可以再次重新声明它,但这次使用一个默认参数

    void foo(int a, int b = 5);
    

    从这一点开始,你可以用一个明确的参数来调用它。

    再向下,您可以重新声明它再次添加一个默认参数

    void foo(int a = 1, int b);
    

    从这一点开始,您可以在没有明确参数的情况下调用它。

    完整示例可能如下所示

    void foo(int a, int b);
    
    int main()
    {
      foo(2, 3);
    
      void foo(int a, int b = 5); // redeclare
      foo(8); // OK, calls `foo(8, 5)`
    
      void foo(int a = 1, int b); // redeclare again
      foo(); // OK, calls `foo(1, 5)`
    }
    
    void foo(int a, int b)
    {
      // ...
    }
    

    至于你问题中的代码,两种变体都是完全有效的,但它们意味着不同的东西。第一个变量立即声明第二个参数的默认参数。第二个变体最初声明你的函数没有默认参数,然后为第二个参数添加一个。

    两个声明的净效果(即第二个声明后面的代码看到的方式)完全相同:函数的第二个参数有默认参数。但是,如果您设法在第一个和第二个声明之间挤压一些代码,则这两个变体的行为会有所不同。在第二个变体中,函数在声明之间没有默认参数,因此您必须明确指定两个参数。

答案 2 :(得分:5)

第一种方式优于第二种方式。

这是因为头文件将显示该参数是可选的以及它的默认值。此外,这将确保默认值将是相同的,无论相应的.cpp文件的实现。

在第二种方式中,不保证第二个参数的默认值。默认值可能会更改,具体取决于相应的.cpp文件的实现方式。

答案 3 :(得分:4)

必须使用函数原型中第一次出现的函数名来指定默认参数。如果函数原型被省略,因为函数定义也作为原型,那么应该在函数头中指定默认参数。

答案 4 :(得分:0)

这里要记住的一点是,默认参数必须是函数定义中的最后一个参数。

以下代码将无法编译:

void fun(int first, int second = 10, int third);

以下代码将编译:

void fun(int first, int second, int third = 10);