QExplicitlySharedDataPointer 类

template <typename T> class QExplicitlySharedDataPointer

QExplicitlySharedDataPointer 类表示对一个显式共享对象的指针。 更多信息...

头文件 #include <QExplicitlySharedDataPointer>
CMakefind_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmakeQT += core

注意: 此类中所有函数都是重入的。

公共类型

公共函数

QExplicitlySharedDataPointer()
QExplicitlySharedDataPointer(T *data)
QExplicitlySharedDataPointer(const QExplicitlySharedDataPointer<X> &o)
QExplicitlySharedDataPointer(const QExplicitlySharedDataPointer<T> &o)
QExplicitlySharedDataPointer(QExplicitlySharedDataPointer<T> &&o)
~QExplicitlySharedDataPointer()()
const T *constData() const
T *data() const
voiddetach()
(since 6.0) T *get() const
(since 6.0) voidreset(T *ptr = nullptr)
voidswap(QExplicitlySharedDataPointer<T> &other)
T *take()
booloperator bool() const
booloperator!() const
T &operator*() const
T *operator->()
T *operator->() const
QExplicitlySharedDataPointer<T> &operator=(const QExplicitlySharedDataPointer<T> &o)
QExplicitlySharedDataPointer<T> &operator=(T *o)
QExplicitlySharedDataPointer<T> &operator=(QExplicitlySharedDataPointer<T> &&other)

保护函数

T *clone()
booloperator!=(const QExplicitlySharedDataPointer<T> &lhs, const QExplicitlySharedDataPointer<T> &rhs)
booloperator!=(const T *ptr, const QExplicitlySharedDataPointer<T> &rhs)
booloperator==(const QExplicitlySharedDataPointer<T> &lhs, const QExplicitlySharedDataPointer<T> &rhs)
booloperator==(const T *ptr, const QExplicitlySharedDataPointer<T> &rhs)

详细描述

QExplicitlySharedDataPointer让编写自己的显式共享类变得简单。QExplicitlySharedDataPointer实现了线程安全的引用计数,确保将QExplicitlySharedDataPointer添加到你的重入类中不会使其变成非重入。

除了一个重要区别外,QExplicitlySharedDataPointer与QSharedDataPointer几乎一样。这个重要区别是QExplicitlySharedDataPointer的成员函数不会在允许共享数据对象修改之前做自动的写时复制操作(detach()),这非const成员的QSharedDataPointer在修改之前会这样做。有一个有效的detach()函数,但如果你真的想detach(),你必须自己调用它。这意味着QExplicitlySharedDataPointers的行为类似于常规的C++指针,除了通过引用计数并在引用计数为0时才删除共享数据对象,从而避免了悬垂指针的问题。

通过一个例子将QExplicitlySharedDataPointer与QSharedDataPointer进行比较是有教育意义的。考虑QSharedDataPointer中的Employee例子,已经修改成使用显式共享,正如隐式与显式共享一节中解释的那样。

注意,如果你使用这个类但是经常调用detach(),那么你很可能应该使用QSharedDataPointer

在成员函数文档中,指针d始终指共享数据对象的内部指针。

另请参阅QSharedDataQSharedDataPointer

成员类型文档

QExplicitlySharedDataPointer::Type

这是共享数据对象的类型。指针d指向此类型的对象。

成员函数文档

[noexcept] QExplicitlySharedDataPointer::QExplicitlySharedDataPointer()

使用nullptr作为指针d构造QExplicitlySharedDataPointer。

[explicit noexcept] QExplicitlySharedDataPointer::QExplicitlySharedDataPointer(T *数据)

使用数据设置指针d并增加数据的引用计数,以构造QExplicitlySharedDataPointer。

[noexcept] template <typename X> QExplicitlySharedDataPointer::QExplicitlySharedDataPointer(const QExplicitlySharedDataPointer<X> &o)

此复制构造函数不同之处在于它允许o是不同类型的显式共享数据指针,但是具有兼容的共享数据对象。

默认情况下,o的指针d(类型为X *)会隐式转换为T *类型;转换的结果将设置为this的指针d,并增加共享数据对象的引用计数。

然而,如果在使用QExplicitlySharedDataPointer头文件前定义了宏QT_ENABLE_QEXPLICITLYSHAREDDATAPOINTER_STATICCAST,那么o的指针d将经过一个static_cast转换为类型T *。然后将这个转换的结果设置为this的指针d,并增加共享数据对象的引用计数。

警告:依赖于此类 static_cast 是潜在危险的,因为它允许代码像这样编译

    QExplicitlySharedDataPointer<Base> base(new Base);
    QExplicitlySharedDataPointer<Derived> derived(base); // !!! DANGER !!!

从 Qt 5.4 开始,默认禁用此类型转换。可以通过定义宏 QT_ENABLE_QEXPLICITLYSHAREDDATAPOINTER_STATICCAST 来重新启用它,因此无需修改即可允许旧代码(依赖于此功能)编译。

[noexcept] QExplicitlySharedDataPointer::QExplicitlySharedDataPointer(const QExplicitlySharedDataPointer<T> &o)

此标准复制构造函数将 thisd 指针 设置为 o 中的 d 指针,并增加共享数据对象的引用计数。

[noexcept] QExplicitlySharedDataPointer::QExplicitlySharedDataPointer(QExplicitlySharedDataPointer<T> &&o)

将 QExplicitlySharedDataPointer 实例移动构造,使其指向与 o 指向相同的对象。

QExplicitlySharedDataPointer::~QExplicitlySharedDataPointer()

减少共享数据对象的引用计数。如果引用计数变为 0,则删除共享数据对象。然后销毁它。

[protected] T *QExplicitlySharedDataPointer::clone()

创建并返回当前数据的深度副本。当引用计数大于 1 时,此函数由 detach() 调用来创建新的副本。此函数使用 operator new 并调用类型 T 的复制构造函数。

有关如何使用它的说明,请参阅 QSharedDataPointer<T>::clone()。

[noexcept] const T *QExplicitlySharedDataPointer::constData() const

返回共享数据对象的 const 指针。

另请参阅 data().

[noexcept] T *QExplicitlySharedDataPointer::data() const

返回共享数据对象的指针。

void QExplicitlySharedDataPointer::detach()

如果共享数据对象的引用计数大于 1,此函数会创建共享数据对象的深度副本,并将 thisd 指针 设置为副本。

由于 QExplicitlySharedDataPointer 不执行 QSharedDataPointer 成员的自动 写时复制 操作,detach() 在本类的任何成员函数中都不会自动调用。如果您发现自己在代码的每个地方都调用 detach(),请考虑使用 QSharedDataPointer

[noexcept, since 6.0] T *QExplicitlySharedDataPointer::get() const

data 相同。此函数提供以与 STL 兼容。

此函数在 Qt 6.0 中引入。

[noexcept, since 6.0] void QExplicitlySharedDataPointer::reset(T *ptr = nullptr)

将该对象的 指针 设置为 ptr,如果 ptr 不是 nullptr,则增加 ptr 的引用计数。旧共享数据对象的引用计数减少,当引用计数达到 0 时,对象被删除。

此函数在 Qt 6.0 中引入。

[noexcept] void QExplicitlySharedDataPointer::swap(QExplicitlySharedDataPointer<T> &other)

将此实例的显式共享数据指针与 other 中的显式共享数据指针交换。

[noexcept] T *QExplicitlySharedDataPointer::take()

返回对共享对象的指针,并将 this 重置为 nullptr。 (也就是说,此函数将 this指针 设置为 nullptr。)

注意:返回对象的引用计数将 不会 减少。此函数可以与接收 QAdoptSharedDataTag 标签对象的构造函数一起使用,以原子操作的方式来传递共享数据对象。

[noexcept] bool QExplicitlySharedDataPointer::operator bool() const

如果 this指针 不是 null,则返回 true

[noexcept] bool QExplicitlySharedDataPointer::operator!() const

如果 this指针nullptr,则返回 true

T &QExplicitlySharedDataPointer::operator*() const

提供对共享数据对象成员的访问。

[noexcept] T *QExplicitlySharedDataPointer::operator->()

提供对共享数据对象成员的访问。

[noexcept] T *QExplicitlySharedDataPointer::operator->() const

提供对共享数据对象成员的常量访问。

[noexcept] QExplicitlySharedDataPointer<T> &QExplicitlySharedDataPointer::operator=(const QExplicitlySharedDataPointer<T> &o)

this指针 设置为 o指针,并增加共享数据对象的引用计数。此 this 中的旧共享数据对象的引用计数减少。如果旧共享数据对象的引用计数变为 0,则删除旧共享数据对象。

[noexcept] QExplicitlySharedDataPointer<T> &QExplicitlySharedDataPointer::operator=(T *o)

this指针 设置为 o,并增加 o 的引用计数。此 this 中的旧共享数据对象的引用计数减少。如果旧共享数据对象的引用计数变为 0,则删除旧共享数据对象。

[noexcept] QExplicitlySharedDataPointer<T> &QExplicitlySharedDataPointer::operator=(QExplicitlySharedDataPointer<T> &&other)

将《other》移至当前QExplicitlySharedDataPointer 实例。

相关非成员函数

[noexcept] bool operator!=(const QExplicitlySharedDataPointer<T> &lhs, const QExplicitlySharedDataPointer<T> &rhs)

如果 lhsrhs 没有相同的 d指针,则返回 true。

[noexcept] bool operator!=(const T *ptr, const QExplicitlySharedDataPointer<T> &rhs)

如果 rhsd指针 不等于 ptr,则返回 true。

[noexcept] bool operator==(const QExplicitlySharedDataPointer<T> &lhs, const QExplicitlySharedDataPointer<T> &rhs)

如果 lhsrhs 有相同的 d指针,则返回 true。

[noexcept] bool operator==(const T *ptr, const QExplicitlySharedDataPointer<T> &rhs)

如果 rhsd指针 等于 ptr,则返回 true。

© 2024 The Qt Company Ltd. 本文档的贡献归其各自的 owners 所有。本文档是根据自由软件基金会发布的 GNU 自由文档许可证版本 1.3 许可的。Qt 和相应的商标在芬兰及其它全世界都是 The Qt Company Ltd. 的商标。所有其他商标均为其各自 owners 的财产。