【问题标题】:Where should default parameters be specified?应该在哪里指定默认参数?
【发布时间】:2010-10-12 06:26:15
【问题描述】:

在我的工作场所,通常在声明中指定默认参数。正常的习惯是什么?我应该在方法声明或方法定义中指定默认参数吗?

编辑:有没有办法为引用指定默认参数?

编辑:有人可以提供参考参数的默认参数示例吗?

【问题讨论】:

  • @Charles Bailey 最初的问题有一个 C 标签,所以我认为 OP 是在询问函数原型中的参数。现在我不是 100% 确定要问什么,所以我删除了我的答案。

标签: c++ default-arguments


【解决方案1】:

方法声明。调用者可能没有定义,但调用处必须知道默认参数。

【讨论】:

  • 是的,引用的默认参数与其他默认参数的工作方式相同。
【解决方案2】:

ybungalobill 已经回答了关于在哪里的问题。

关于引用,对于const的引用T你可以直接指定一个默认值。

对于非const 的引用,您需要指定默认“值”作为对非const 的引用。这可能是全局的,也可能是具有适当转换的类的实例。例如,

#include <iostream>

struct DummyInt
{
    int dummy;
    operator int& () { return dummy; }
    DummyInt(): dummy( 0 ) {}
};

void foo( int& v = DummyInt() ) {}  // Whatever

int main()
{
    int x   = 42;
    foo( x );
    foo();
}

干杯,

--阿尔夫

【讨论】:

  • 谢谢,正是我想要的。
  • 你的例子有潜在危险吗?如果在函数体中使用了参数v,那么DummyInt 的生命周期和所包含的dummy 在输入函数体时是否已经结束?我知道如果绑定到const 引用,临时人员可以延长他们的生命周期,但我不认为这个规则或类似的东西在这里成立。
  • 那么如何为非常量引用使用默认参数呢?
  • @Alf P. Steinbach:我需要像这样为每个默认参数定义一个结构吗?顺便说一句,在 DummyInt() 之后,您缺少几个括号
  • 不,该示例没有潜在危险(临时的生命周期通过调用的完整表达式扩展),不,没有缺少括号。 :-)
【解决方案3】:

嗯,通常的做法是为所有翻译单元使用相同的默认参数集。为了实现这一点,您显然必须在头文件中的函数声明中指定默认参数。

至于引用参数的默认参数...当然是可以的。例如

extern int i;

void foo(int &r = i);
void bar(const double &r = 0);

【讨论】:

  • Well, the normal practice is to have the default arguments to be the same for all translation units. 这是什么意思? :D。而且,我必须在其他地方定义i。 :(
【解决方案4】:

必须在方法声明处,以便调用者知道函数的确切期望。
您可以像 Alf 所说的那样做技巧,但不确定为什么需要它。可能是你想看看你的功能设计。

【讨论】:

    【解决方案5】:

    我曾经使用默认值,但同时我改变了主意:我发现当我显式编写参数值时代码可读性更好。有时我会定义另一种方法,如下所示:

    bool Initialize( const char * pszPath );
    bool InitializeDefault();
    

    而不是

    bool Initialize( const char * pszOptPath = NULL );
    

    【讨论】:

    • 第一句不正确。但实际上调用代码可能看不到定义。必须在调用代码看到的代码中指定默认参数,以便对调用代码有用。
    • @Alf: 在函数定义(.cpp 文件中)指定默认值有什么实际用途吗?
    • @Alf:参见 Bjarne www2.research.att.com/~bs/glossary.html#Gdefault-argument“默认参数 - 为函数声明中的参数指定的值,如果函数调用未指定该参数的值,则使用该值. 这通常用于允许一个简单的接口用于常见用途,同时通过指定更多参数来轻松使用不太常用的工具。”
    • @ur:我想不出任何在单独编译的文件中定义方法实现中的默认参数会有用的示例,但也许在某些极端情况下。但是,对于仅包含标头的模块,在类中内联定义方法是合理的。当然,您可以在这样的定义中定义默认参数。 :-)
    • @ur:关于 Bjarne(编辑:当我写这篇文章时,你的评论只是“见 Bjarne”),Facebook 一直给我同样的建议,但我无法想象他会对我在那里发布的所有音乐视频链接感兴趣,所以我认为这只是 Facebook 的固定想法。 :-)
    猜你喜欢
    • 1970-01-01
    • 2015-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-04
    • 2012-04-24
    • 2019-09-20
    • 1970-01-01
    相关资源
    最近更新 更多