【问题标题】:default arguments in constructor构造函数中的默认参数
【发布时间】:2010-12-10 16:31:51
【问题描述】:

我可以在这样的构造函数中使用默认参数吗

Soldier(int entyID, int hlth = 100, int exp = 10, string nme) : entityID(entyID = globalID++), health(hlth), experience(exp), name(nme = SelectRandomName(exp)) { }

例如,我希望默认为 exp = 10,但如果我在构造函数中提供该值,则可以覆盖此值,否则应使用默认值。

我该怎么做,我知道我的方法行不通....

如果我在初始化列表中提供任何值,无论我在构造函数中提供什么,都会被覆盖,另一方面,每当我在构造函数中提供一个值时,为什么我每次都需要一个默认值为对象启动提供值...?

我应该使用不同的重载构造函数还是你们有其他想法......?

【问题讨论】:

  • 是的,你应该使用重载的构造函数。
  • 您的构造函数定义将无法编译,而您的帖子似乎描述了运行时行为。这意味着您很可能发布了一个虚假的构造函数定义。请张贴真实的。
  • 如果你的构造函数有可能只用一个参数调用,它应该是explicit

标签: c++ constructor default arguments


【解决方案1】:

只有尾随参数可以是默认参数。您需要为 nme 提供默认参数或更改构造函数采用的参数顺序,以便 hlthexp 排在最后。

关于您在初始化列表中所做的分配,会发生什么情况是成员entityID 被分配了由globalID++entyID 的分配返回的值,这将是entyID 的值分配后。 name 也会发生类似的情况。

【讨论】:

    【解决方案2】:

    具有默认值的参数必须是函数声明中的最后一个参数。换句话说,任何没有默认值的参数都不能跟在有默认值的参数之后。

    【讨论】:

      【解决方案3】:

      我相信你可以做到这一点,但是,你所有的默认参数最终都需要去。因此,在您的示例中,构造函数签名将是

      Soldier(int entyID, string nme, int hlth = 100, int exp = 10);
      

      【讨论】:

        【解决方案4】:

        默认参数只能提供给延伸到参数列表末尾的连续参数范围。简单地说,您可以为函数的 1, 2, 3, ... N last 参数提供默认参数。您不能像上面尝试的那样为参数列表中间的参数提供默认参数。重新排列您的参数(将hlthexp 放在末尾)或为nme 提供默认参数。

        此外,您的构造函数初始化列表似乎没有任何意义。如果您在构造函数初始化列表中覆盖它们的值,那么从外部传递 entyIDnme 有什么意义?

        【讨论】:

          【解决方案5】:

          所有带有默认参数的参数都需要在任何必需的参数之后。您应该将nme 参数移到hlth 之前。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-06-30
            • 2014-07-09
            • 1970-01-01
            • 2012-02-26
            • 2011-11-05
            • 2016-06-05
            • 2016-01-06
            • 2018-02-02
            相关资源
            最近更新 更多