【问题标题】:C++ Default values in functions?C ++函数中的默认值?
【发布时间】:2015-08-29 07:52:09
【问题描述】:

函数中的默认值究竟是如何工作的?我的问题与这个例子有关:

int func(int number, std::string name = "None", int anotherNumber);

..

int func(int number, std::string name, int anotherNumber){
    ...
}

func(1, 2);
^Error, name is NULL yet we've defined a default value?

编译器给出一个错误,抱怨参数是 NULL 并且不应该是。然而我已经为它定义了一个默认值。

这是为什么?

【问题讨论】:

  • 这不应该是唯一的错误。您不能只给任何参数一个默认值,它们必须位于参数列表的末尾。
  • 为什么一定要放在最后?是否只是 C++ 所做的我们无能为力的事情?
  • 您没有显示真正的错误。不要胡编乱造;从您的输出中粘贴它们。
  • @JoeBid:考虑void f(int, int = 1, int = 2, int);f(3, 4, 5) 是什么意思?
  • 嗯,我想我现在明白了。有道理。

标签: c++ default-value


【解决方案1】:

如果提供了位置k 的默认参数,则还必须提供位置从k+1 到末尾的所有参数。 C++ 允许您仅在结束位置省略参数,否则它无法将参数表达式与形式参数匹配。

考虑这个例子:

int func(int a, int b=2, int c, int d=4);
...
foo(10, 20, 30);

这个调用是模棱两可的,因为它提供了四个参数中的三个。如果允许上述声明,C++ 将可以选择调用

func(10, 20, 30, 4);

func(10, 2, 30, 40);

所有的默认参数都在最后,并且有一个参数按位置匹配的规则,就不会有这样的歧义了:

int func(int a, int b, int c=2, int d=4);
...
foo(10, 20, 30); // means foo(10, 20, 30, 4);

【讨论】:

  • “参数表达式”是指“参数”吗?
  • “默认参数”是指“默认参数”吗?
  • @KerrekSB 尽管 C++ 标准有时将“实际参数”称为“参数”,但这在更广泛的编程社区中并没有完全赶上,其中“参数”和“参数”经常互换使用.我曾短暂地考虑过用“实际参数”代替“参数表达式”,但认为那太正式了。
  • "因为否则它无法将参数表达式与形式参数匹配。"也可以反过来,首先使用默认参数。这是两个可行选项之间的选择。
  • @juanchopanza 是的。此外,人们可以想出其他方法来解决这个问题——例如通过允许用户以任意顺序指定参数,并要求在调用 Ada 样式中指定形式参数名称。
【解决方案2】:

默认参数在最后。

int func(int number1, int number2, std::string = "none");
...
func(1,2); 

https://en.wikipedia.org/wiki/Default_argument

【讨论】:

    猜你喜欢
    • 2013-01-27
    • 2011-03-19
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 2013-04-15
    • 1970-01-01
    • 2019-09-12
    相关资源
    最近更新 更多