【问题标题】:c++ -- Confusion about using Default Argument [duplicate]c ++ - 关于使用默认参数的困惑[重复]
【发布时间】:2016-11-08 21:41:23
【问题描述】:

例如,有 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 &lt;&lt; sum (1,2,3) &lt;&lt; endl;,它可以正常工作 但是如何只传递 2 个参数?

【问题讨论】:

  • 将默认参数放在标题中。

标签: c++


【解决方案1】:

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

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

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

此外,您可以在更小的范围内重新声明函数,并提供完全不同的默认参数。这段代码 sn-p 取自 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)
} 

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

【讨论】:

  • @Remy,如果您以后建议编辑,我将不胜感激。我刚刚丢失了我正在编辑的一段。
【解决方案2】:

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

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

无需在函数实现中指定。

【讨论】:

    猜你喜欢
    • 2017-04-25
    • 2013-02-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-25
    • 2017-07-10
    • 2017-09-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多