考虑以下讲师,无论如何我都必须初始化 treeItem 和 status ,但是在重载函数中,我也可以引入 id 变量。
但这看起来很傻,我不应该在这两个功能中都这样做,有什么建议吗?
Contact ()
{
treeItem = NULL;
status = offline;
}
Contact (const QString & id)
{
treeItem = NULL;
status = offline;
this->id = id;
}
考虑以下讲师,无论如何我都必须初始化 treeItem 和 status ,但是在重载函数中,我也可以引入 id 变量。
但这看起来很傻,我不应该在这两个功能中都这样做,有什么建议吗?
Contact ()
{
treeItem = NULL;
status = offline;
}
Contact (const QString & id)
{
treeItem = NULL;
status = offline;
this->id = id;
}
您将从ctor-initializer-list 中受益,但在升级到 C++11 之前,您确实需要为每个构造函数复制变量初始化。
一种选择是使用默认参数来减少构造函数的数量,如下所示:
Contact (const QString& identifier = QString())
: treeItem(NULL), status(offline), id(identifier)
{
}
使用默认参数来避免显式定义两个构造函数。并使用初始化列表。像这样:
Contact (const QString & id = QString())
: treeItem(NULL)
, status(offline)
, id(id) // yes this works but you may wish to change the parameter name)
{}
或者在 C++11 中使用委托构造函数::
Contact ()
: treeItem(NULL)
, status(offline)
{}
Contact (const QString & id = QString())
: Contact()
, id(id)
{}
如果你真的想重载构造函数(而不是提供默认值),你能做的最好的是将公共代码移动到它自己的函数中,然后从每个构造函数中调用它:
Contact()
{
init();
}
Contact(const QString &id)
{
init();
this->id = id;
}
private void init() {
treeItem = NULL;
status = offline;
}