考虑构造对象的 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% 相等吗?如果不是,它们有什么不同?与每种方法相关的优点/缺点是什么?
我猜测在 1 和 2 的情况下,一些关于复制赋值、移动构造函数或现代 c++11 及更高版本中的一些高级事情正在完成。
最佳答案
对于大多数类型,第一个和第二个会做同样的事情。但是,对于具有接受 std::initializer_list
的构造函数的类型,第一个会更喜欢它,而第二个会更喜欢普通的构造函数。经典示例是带有两个参数的 std::vector
-- 它们是要放入 vector 中的两项,还是一项具有重复计数的项。
第三个版本根本不控制构造。正如 Mateusz 正确指出的那样,默认构造函数用于创建对象,然后通过赋值提供值。在很多类型上,有些参数只能在构造时设置,赋值时不能改变,这种方法根本行不通。还要考虑必须在构造时绑定(bind)的引用和必须使用其最终值构造的 const
成员,因为赋值被禁用。
关于c++ - 构造对象的方法有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46589468/