在我正在上课的课程中,我正在玩弄几个 QList
秒。我听说Qt试图尽可能不制作列表的深层副本。据我所知,这意味着当你这样做时不会发生深层复制:
QList<int> myList;
myList << 1 << 2 << 3 << 4;
QList<int> otherList = myList; // No deep copy
在某些情况下,我需要确保永远不会发生深层复制 QList
。确切地说,我需要确保避免哪种操作或操作,以确保永远不会发生深层复制 QList
我在和谁合作?
QLists是使用 隐性共享。
隐式共享对象的对象赋值(使用operator =())
使用浅拷贝实现。
这意味着单独分配永远不会导致包含的数据被复制。但是,写入共享实例 将 导致复制源对象。这种模式通常称为写时复制。
因此,要回答您的问题,如果您从未写过共享实例,那么它们将永远不会被复制。如果要完全阻止复制,则从QList派生并覆盖并隐藏复制构造函数和赋值运算符。
当您将QList作为函数的参数传递或者在不修改它的情况下创建副本时,Qt只传递一个“包装器”,实际数据永远不会被复制。隐式共享是Flyweight模式的Qt实现,请参阅 这里。
只要确保使用 constBegin()
, constEnd()
, 经过 const
参考,不要修改或复制。