11

在我正在上的一门课上,我正在处理几个QLists. 我听说 Qt 尽可能不制作列表的深层副本。据我了解,这意味着当你这样做时不会发生深拷贝:

QList<int> myList;
myList << 1 << 2 << 3 << 4;
QList<int> otherList = myList;  // No deep copy

在某些情况下,我需要确保深拷贝永远不会发生在QList. 究竟我需要确保避免什么样的操作或动作,以确保QList我正在使用的对象永远不会发生深拷贝?

4

3 回答 3

13

QLists 是使用隐式共享实现的。

隐式共享对象的对象分配(使用 operator=())是使用浅拷贝实现的。

这意味着单独的赋值永远不会导致包含的数据被复制。但是,写入共享实例导致源对象被复制。这种模式通常称为写时复制。

因此,要回答您的问题,如果您从不写入共享实例,那么它们将永远不会被复制。如果您想完全防止复制,请从 QList 派生并覆盖和隐藏复制构造函数和赋值运算符。

于 2011-07-28T22:00:50.257 回答
2

当您将 QList 作为函数的参数传递时,或者当您创建副本而不修改它时,Qt 只需传递一个“包装器”,实际数据永远不会被复制。隐式共享是享元模式的 Qt 实现,请参见此处

于 2011-07-29T01:15:31.027 回答
1

只要确保使用constBegin(), constEnd(), 引用传递const,不要修改或复制。

于 2015-07-14T15:45:16.220 回答