构造函数中的默认参数

时间:2009-10-27 23:03:18

标签: c++ constructor default arguments

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

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 个答案:

答案 0 :(得分:8)

默认参数只能提供给延伸到参数列表末尾的连续参数范围。简单来说,您可以为函数的1,2,3,... N last 参数提供默认参数。您无法在参数列表中间为参数提供默认参数,正如您在上面尝试的那样。您可以重新排列参数(最后放置hlthexp),也可以为nme提供默认参数。

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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

具有默认值的参数必须是函数声明中的最后一个参数。换句话说,如果没有默认值,则不能有任何参数使用默认值。

答案 4 :(得分:1)

只有尾随参数可以是默认参数。您需要给nme一个默认参数或更改构造函数所采用的参数的顺序,以便hlthexp最后。

关于您在初始化列表中所做的任务,会发现会员entityID被分配了globalID++entyID的分配所返回的值。分配后entyID的值。类似的事情发生在name