构造对象的方法之间有什么区别

时间:2017-10-05 15:30:19

标签: c++ c++11

考虑构建对象的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的情况下完成。

2 个答案:

答案 0 :(得分:6)

对于大多数类型,第一个和第二个将做同样的事情。但是,对于具有接受std::initializer_list的构造函数的类型,第一个更喜欢它,第二个更喜欢普通的构造函数。经典的例子是std::vector有两个参数 - 它们是放入向量的两个项目,还是一个带有重复计数的项目。

第三个版本根本没有控制结构。正如Mateusz正确指出的那样,默认构造函数用于创建对象,然后通过赋值提供值。在许多类型中,某些参数只能在构造期间设置,并且在分配期间不能更改,并且此方法根本不起作用。还要考虑必须在构造时绑定的引用和const成员,这些成员必须使用其最终值构造,因为赋值已被禁用。

答案 1 :(得分:4)

在第三个示例中,首先使用默认构造函数创建成员,然后复制分配。