我可以在像这样的构造函数中使用默认参数吗
Soldier(int entyID, int hlth = 100, int exp = 10, string nme) : entityID(entyID = globalID++), health(hlth), experience(exp), name(nme = SelectRandomName(exp))
{ }
我希望默认情况下例如exp = 10但是如果我在构造函数中提供它,则能够覆盖此值,否则它应该使用默认值。
我怎么能这样做,我知道我的方法不起作用......
如果我在初始化列表中提供任何值,无论我在构造函数中提供的是什么,另一方面,当我在构造函数中提供值时,覆盖了所有事件,那么为什么我每次都需要一个默认值为对象启动提供值??
我应该使用不同的重载构造函数,还是人们有其他想法....?
答案 0 :(得分:8)
默认参数只能提供给延伸到参数列表末尾的连续参数范围。简单来说,您可以为函数的1,2,3,... N last 参数提供默认参数。您无法在参数列表中间为参数提供默认参数,正如您在上面尝试的那样。您可以重新排列参数(最后放置hlth
和exp
),也可以为nme
提供默认参数。
此外,构造函数初始化列表似乎没有任何意义。如果你在构造函数初始化列表中覆盖它们的值,那么从外部传递entyID
和nme
有什么意义呢?
答案 1 :(得分:2)
所有带有默认参数的参数都需要在任何必需的参数之后。您应该在nme
之前移动hlth
参数。
答案 2 :(得分:2)
我相信你可以做到这一点,然而,所有你的默认args都需要在最后。因此,在您的示例中,构造函数签名将是
Soldier(int entyID, string nme, int hlth = 100, int exp = 10);
答案 3 :(得分:1)
具有默认值的参数必须是函数声明中的最后一个参数。换句话说,如果没有默认值,则不能有任何参数使用默认值。
答案 4 :(得分:1)
只有尾随参数可以是默认参数。您需要给nme
一个默认参数或更改构造函数所采用的参数的顺序,以便hlth
和exp
最后。
关于您在初始化列表中所做的任务,会发现会员entityID
被分配了globalID++
到entyID
的分配所返回的值。分配后entyID
的值。类似的事情发生在name
。