考虑构建对象的3种方法:
1)
LogTreeItem::LogTreeItem(const QList<QVariant>& data, LogTreeItem* parent) :
m_parentItem {parent}, m_itemData {data}
{
}
2)
LogTreeItem::LogTreeItem(const QList<QVariant>& data, LogTreeItem* parent) :
m_parentItem (parent), m_itemData (data)
{
}
第3)
TreeItem::TreeItem(const QList<QVariant> &data, TreeItem *parent)
{
m_parentItem = parent;
m_itemData = data;
}
他们100%平等吗?如果没有,他们在哪里不同?每种方法有哪些优点/缺点?
我正在猜测一些关于复制赋值,移动构造函数或现代c ++ 11及其他一些高级内容的东西在1和2的情况下完成。
答案 0 :(得分:6)
对于大多数类型,第一个和第二个将做同样的事情。但是,对于具有接受std::initializer_list
的构造函数的类型,第一个更喜欢它,第二个更喜欢普通的构造函数。经典的例子是std::vector
有两个参数 - 它们是放入向量的两个项目,还是一个带有重复计数的项目。
第三个版本根本没有控制结构。正如Mateusz正确指出的那样,默认构造函数用于创建对象,然后通过赋值提供值。在许多类型中,某些参数只能在构造期间设置,并且在分配期间不能更改,并且此方法根本不起作用。还要考虑必须在构造时绑定的引用和const
成员,这些成员必须使用其最终值构造,因为赋值已被禁用。
答案 1 :(得分:4)
在第三个示例中,首先使用默认构造函数创建成员,然后复制分配。