c ++ - 关于使用默认参数的困惑

时间:2016-11-08 21:41:24

标签: c++

例如,有3个文件,sum.hsum.cppmain.cpp

sum.h -

    ...
    int sum (int, int, int);
    ...

sum.cpp

    ...
    int sum (int a, int b, int c=10) { 
       return a + b + c;
    }

main.cpp

   ...
   cout << sum (1, 2) << endl;
   ...

编译器抛出错误too few arguments to function...

如果我编码为cout << sum (1,2,3) << endl;,它可以正常工作 但是如何只传递2个参数?

2 个答案:

答案 0 :(得分:2)

默认函数参数必须包含在调用站点看到的函数声明中。

int sum (int, int, int = 10);

在调用函数的表达式中需要它们。实现不应该关心它是否传递了默认值。

此外,您可以在较小的范围内重新声明该函数,并提供完全不同的默认参数。此代码段摘自c ++ 17标准草案,并演示了我的意思:

void f(int, int);
void f(int, int = 7);
void h() {
  f(3);                         // OK, calls f(3, 7)
  void f(int = 1, int);         // error: does not use default
                                // from surrounding scope
}
void m() {
  void f(int, int);             // has no defaults
  f(4);                         // error: wrong number of arguments
  void f(int, int = 5);         // OK
  f(4);                         // OK, calls f(4, 5);
  void f(int, int = 5);         // error: cannot redefine, even to
                                // same value
}
void n() {
  f(6);                         // OK, calls f(6, 7)
} 

理论上(在实践中不要这样做),你甚至可以使用不同的标题声明具有不同默认参数值的相同函数。它将按预期工作,只要它们不包含在同一个翻译单元中。

答案 1 :(得分:1)

您必须在原型中指定默认值(.h文件中的函数定义):

int sum (int, int, int=10);

无需在函数实现中指定它。