c++ - 构造对象的方法有什么区别

标签 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% 相等吗?如果不是,它们有什么不同?与每种方法相关的优点/缺点是什么?

我猜测在 1 和 2 的情况下,一些关于复制赋值、移动构造函数或现代 c++11 及更高版本中的一些高级事情正在完成。

最佳答案

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

第三个版本根本不控制构造。正如 Mateusz 正确指出的那样,默认构造函数用于创建对象,然后通过赋值提供值。在很多类型上,有些参数只能在构造时设置,赋值时不能改变,这种方法根本行不通。还要考虑必须在构造时绑定(bind)的引用和必须使用其最终值构造的 const 成员,因为赋值被禁用。

关于c++ - 构造对象的方法有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46589468/

相关文章:

c++ - shared_ptr 在哪里?

c++ - 有没有办法在C++字符数组中输入所需数量的字符

C++ 程序返回数字而不是 Char

c++ - 使用 c++11 标志为 OpenWRT 交叉编译

c++ - "abc"[0] 不是编译时常量

c++ - 如何将此 C 代码转换为 C++?

c++ - C++ 中的二维数组归零。我需要 2 个 for 循环吗?

C++:以具有char *属性的存档格式保存类对象并从文件中读回

c++ - QImage错误着色,格式为Indexed8

c++ - 用于迭代 "between each consecutive pair of elements"的成语