代码之家  ›  专栏  ›  技术社区  ›  Asad Khan

构造函数中的默认参数

  •  2
  • Asad Khan  · 技术社区  · 17 年前

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

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

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

    我怎么能做到这一点,我知道我的方法行不通……

    如果我在初始化列表中提供任何值,不管我在构造函数中提供什么,在另一方面,每当我在构造函数中提供一个值时,当然会被覆盖,那么为什么我首先需要一个默认值,就像每次我为对象启动提供一个值一样…?

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

    5 回复  |  直到 17 年前
        1
  •  8
  •   AnT stands with Russia    17 年前

    默认参数只能提供给扩展到参数列表末尾的连续参数范围。简单地说,您可以为1、2、3……提供默认参数。n 最后的 函数的参数。无法为参数列表中间的参数提供默认参数,正如上面所做的那样。重新排列参数(输入 hlth 和 exp 或提供默认参数 nme 也。

    此外,构造函数初始值设定项列表似乎没有任何意义。传球的目的是什么 entyID 和 非金属材料 从外部来看,是否仍在构造函数初始值设定项列表中重写它们的值?

        2
  •  2
  •   Cogwheel    17 年前

    具有默认参数的所有参数都必须位于任何必需参数之后。你应该移动 nme 参数之前 hlth .

        3
  •  2
  •   Jeff Shattock    17 年前

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

    Soldier(int entyID, string nme, int hlth = 100, int exp = 10);
    
        4
  •  1
  •   joshperry    17 年前

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

        5
  •  1
  •   Troubadour    17 年前

    只有尾随参数可以是默认参数。你需要付出 nme 默认参数或更改构造函数接受的参数的顺序,以便 hlth 和 exp 最后一个。

    关于您在初始化器列表中所做的分配,会发生什么情况 entityID 获取通过赋值返回的值 globalID++ 到 entyID 这将是 乙炔 任务完成后。类似的事情发生在 name .