我使用c ++编写Nintendo DS(4MB RAM)。我已经创建了一个按钮类来显示UI like I described here中的按钮。为方便起见,我有四个独立的构造函数。我可以将它们全部压缩成一个构造,但这样会很不方便,因为我需要在构造它时使用所有参数。我的问题是:
当程序运行时,是否有多个重载的构造函数会占用每个对象更多的内存,或者编译器会自动剥离每个对象不需要的其他3个不必要的构造函数吗?
感谢任何帮助。以下是具有解释的构造函数的参数:
Button::Button(int x, int y, const char * const label)
{
//Set visibility to true as a default
//Set length to String length
}
Button::Button(int x, int y, const char * const label, bool isVisible)
{
//Set the length to the string length
}
Button::Button(int x, int y, const char * const label, int length)
{
//set visibility to true as a default
}
Button::Button(int x, int y, const char * const label, int length, bool isVisible)
{
//All the variables are specified using constructor
}
答案 0 :(得分:5)
虽然我同意其他答案,但是减少构造函数的数量并不会为对象存储成本节省任何费用,您可能应该只是为了方便。
我可以将它们全部压缩成一个构造,但是会不方便因为我需要在构造它之前使用所有参数。
它不一定是这样的:这是default parameters的用途。您可以在这样的标题中对构造函数进行原型设计:
class Button {
Button (
int x,
int y,
const char * const label,
int length = -1,
bool isVisible = true
);
注意最后两个参数后面的=
。这意味着您不必提供这些,如果不提供,将使用该值。所以:
new Button(1, 2, "hello");
new Button(1, 2, "hello", 5, false);
都很好。你可以正常定义构造函数,虽然这里的length
字段有点特殊;如果它可能取决于用户提供的label
或的长度,您需要知道其中的差异。因此,在初始化列表中,如果与length
arg对应的成员字段被称为length
(不是我最喜欢的做法,但这里没关系):
length (length > 0 ? length : label.length())
length
将初始化为用户arg(如果它大于0),默认值为-1,因此如果未提供该arg,则将使用label.length()
。
请注意,参数必须按顺序进行,因此您应该考虑哪些参数最有可能使用。如果在这种情况下你想允许在没有另一个的情况下指定任何一个默认参数,你需要两个构造函数。
答案 1 :(得分:4)
构造函数的数量不会改变每个对象使用的内存。添加构造函数不会对对象大小产生影响。
答案 2 :(得分:4)
用于代码的内存不是每个对象而是每个类。一个类有多少个实例(对象)并不重要,只有一次代码副本。
每个实例只有非静态数据成员(成员变量)。