QSharedPointer Class
template <typename T> class QSharedPointerQSharedPointer 类对一个共享指针持有强引用。更多内容...
| 头文件: | #include <QSharedPointer> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake: | QT += core |
注意:该类中的所有函数均为可重入函数。
QSharedPointer 比较
| 类别 | 可比较类型 | 描述 |
|---|---|---|
| strong | QSharedPointer | |
| strong | QSharedPointer<X>、X* 和 std::nullptr_t。 | 其中 X 和 T 是兼容类型,这意味着它们要么相同,要么一个是另一个的基类。 |
公共函数
| QSharedPointer() | |
| QSharedPointer(QSharedPointer<X> &&other) | |
| QSharedPointer(X *ptr) | |
| QSharedPointer(const QWeakPointer<T> &other) | |
| QSharedPointer(std::nullptr_t) | |
| QSharedPointer(X *ptr, Deleter d) | |
| QSharedPointer(std::nullptr_t, Deleter d) | |
| QSharedPointer(const QSharedPointer<T> &other) | |
| QSharedPointer(QSharedPointer<T> &&other) | |
| ~QSharedPointer() | |
| void | clear() |
| QSharedPointer<X> | constCast() const & |
(since 6.9) QSharedPointer<X> | constCast() && |
| T * | data() const |
| QSharedPointer<X> | dynamicCast() const & |
(since 6.9) QSharedPointer<X> | dynamicCast() && |
| T * | get() const |
| bool | isNull() const |
| QSharedPointer<X> | objectCast() const & |
(since 6.9) QSharedPointer<X> | objectCast() && |
(since 6.7) bool | owner_before(const QSharedPointer<X> &other) const |
(since 6.7) bool | owner_before(const QWeakPointer<X> &other) const |
(since 6.7) bool | owner_equal(const QSharedPointer<X> &other) const |
(since 6.7) bool | owner_equal(const QWeakPointer<X> &other) const |
(since 6.7) size_t | owner_hash() const |
| void | reset() |
| void | reset(T *t) |
| void | reset(T *t, Deleter deleter) |
| QSharedPointer<X> | staticCast() const & |
(since 6.9) QSharedPointer<X> | staticCast() && |
| void | swap(QSharedPointer<T> &other) |
| QWeakPointer<T> | toWeakRef() const |
| operator bool() const | |
| bool | operator!() const |
| T & | operator*() const |
| T * | operator->() const |
| QSharedPointer<T> & | operator=(QSharedPointer<T> &&other) |
| QSharedPointer<T> & | operator=(QSharedPointer<X> &&other) |
| QSharedPointer<T> & | operator=(const QSharedPointer<T> &other) |
| QSharedPointer<T> & | operator=(const QWeakPointer<T> &other) |
静态公共成员
| QSharedPointer<T> | create(Args &&... args) |
相关的非成员
| size_t | qHash(const QSharedPointer<T> &key, size_t seed = 0) |
| QSharedPointer<X> | qSharedPointerCast(const QSharedPointer<T> &other) |
| QSharedPointer<X> | qSharedPointerCast(const QWeakPointer<T> &other) |
(since 6.9) QSharedPointer<X> | qSharedPointerCast(QSharedPointer<T> &&other) |
| QSharedPointer<X> | qSharedPointerConstCast(const QSharedPointer<T> &src) |
| QSharedPointer<X> | qSharedPointerConstCast(const QWeakPointer<T> &src) |
(since 6.9) QSharedPointer<X> | qSharedPointerConstCast(QSharedPointer<T> &&src) |
| QSharedPointer<X> | qSharedPointerDynamicCast(const QSharedPointer<T> &src) |
| QSharedPointer<X> | qSharedPointerDynamicCast(const QWeakPointer<T> &src) |
(since 6.9) QSharedPointer<X> | qSharedPointerDynamicCast(QSharedPointer<T> &&src) |
| QSharedPointer<X> | qSharedPointerObjectCast(const QSharedPointer<T> &src) |
| QSharedPointer<X> | qSharedPointerObjectCast(const QWeakPointer<T> &src) |
| std::shared_ptr<X> | qSharedPointerObjectCast(const std::shared_ptr<T> &src) |
| std::shared_ptr<X> | qSharedPointerObjectCast(std::shared_ptr<T> &&src) |
(since 6.9) QSharedPointer<X> | qSharedPointerObjectCast(QSharedPointer<T> &&src) |
(since 6.12) QSharedPointer<X> | qSharedPointerStaticCast(const QSharedPointer<T> &other) |
(since 6.12) QSharedPointer<X> | qSharedPointerStaticCast(const QWeakPointer<T> &other) |
(since 6.12) QSharedPointer<X> | qSharedPointerStaticCast(QSharedPointer<T> &&other) |
| std::shared_ptr<X> | qobject_pointer_cast(const std::shared_ptr<T> &src) |
| std::shared_ptr<X> | qobject_pointer_cast(std::shared_ptr<T> &&src) |
| bool | operator!=(const QSharedPointer<T> &lhs, const QSharedPointer<X> &rhs) |
| bool | operator!=(const QSharedPointer<T> &lhs, const X *rhs) |
| bool | operator!=(const QSharedPointer<T> &lhs, std::nullptr_t) |
| bool | operator!=(const T *lhs, const QSharedPointer<X> &rhs) |
| bool | operator!=(std::nullptr_t, const QSharedPointer<T> &rhs) |
| QDebug | operator<<(QDebug debug, const QSharedPointer<T> &ptr) |
| bool | operator==(const QSharedPointer<T> &lhs, const QSharedPointer<X> &rhs) |
| bool | operator==(const QSharedPointer<T> &lhs, const X *rhs) |
| bool | operator==(const QSharedPointer<T> &lhs, std::nullptr_t) |
| bool | operator==(const T *lhs, const QSharedPointer<X> &rhs) |
| bool | operator==(std::nullptr_t, const QSharedPointer<T> &rhs) |
详细描述
QSharedPointer 是 C++ 中的一个自动共享指针,其中模板参数T 指定了被管理的指针的类型。在正常情况下,它的行为与普通指针完全相同,包括对 const 的尊重。
当 QSharedPointer 超出作用域时,只要没有其他 QSharedPointer 对象引用它,它就会删除所持有的指针。
QSharedPointer 对象可通过普通指针、另一个 QSharedPointer 对象,或将QWeakPointer 对象提升为强引用来创建。
线程安全
QSharedPointer和QWeakPointer 是可重入类。这意味着,一般而言,在没有同步的情况下,多个线程不能同时访问同一个QSharedPointer或QWeakPointer 对象。
不同的 QSharedPointer 和QWeakPointer 对象可被多个线程同时安全访问。这包括它们持有指向同一对象的指针的情况;引用计数机制是原子操作,无需手动同步。
需要注意的是,虽然可以以这种方式(即多个线程同时访问且无需同步)访问指针值,但 QSharedPointer 和QWeakPointer 并不对所指向的对象提供任何保证。该对象的具体线程安全性和可重入性规则仍然适用。
其他指针类
Qt 还提供了另外两个指针封装类:QPointer 和QSharedDataPointer 。它们彼此不兼容,因为各自的应用场景截然不同。
QSharedPointer 通过外部引用计数(即位于对象外部的引用计数器)来持有共享指针。 顾名思义,该指针的值在所有 QSharedPointer 和QWeakPointer 实例之间共享。但请注意,该指针所指向的对象内容不应被视为共享:实际上仅存在一个对象。因此,QSharedPointer 并不提供脱离或复制所指向对象的方法。
QSharedDataPointer另一方面,QSharedData 则持有指向共享数据的指针(即继承自 的类)。 它通过位于基类QSharedData 中的内部引用计数来实现这一点。因此,该类可以根据对受保护数据的访问类型进行分离:如果是非const访问,它会原子地创建一份副本以完成该操作。
QExplicitlySharedDataPointer 是QSharedDataPointer 的一种变体,不同之处在于它仅在显式调用QExplicitlySharedDataPointer::detach()时才进行解耦(因此得名)。
QScopedPointer 仅保存一个指向堆分配对象的指针,并在其析构函数中将其删除。当对象仅需在堆上分配并删除,且不再需要其他操作时,该类非常有用。QScopedPointer 结构轻量,不使用额外的结构体或引用计数机制。
最后,QPointer 持有对QObject 派生对象的指针,但采用弱引用机制。QWeakPointer 具有相同的功能,但该函数已弃用。
可选的指针追踪
QSharedPointer 提供了一项可在编译时启用的指针追踪机制,用于调试目的。启用后,QSharedPointer 会将所有追踪的指针注册到全局集合中。这使得开发者能够捕获诸如将同一个指针分配给两个 QSharedPointer 对象之类的错误。
要启用此功能,需在包含 QSharedPointer 头文件之前定义QT_SHAREDPOINTER_TRACK_POINTERS 宏。
即使在未启用该功能的代码中,使用此功能也是安全的。QSharedPointer 将确保即使在未启用指针跟踪的代码中,该指针也会从跟踪器中移除。
但请注意,指针跟踪功能在多重继承或虚拟继承(即两个不同的指针地址可能指向同一个对象的情况)方面存在限制。 在这种情况下,如果将指针强制转换为另一种类型且其值发生变化,QSharedPointer 的指针跟踪机制可能无法检测到被跟踪的对象是同一个。
另请参阅 QSharedDataPointer 、QWeakPointer 、QScopedPointer 和QEnableSharedFromThis 。
成员函数文档
QSharedPointer::QSharedPointer()
创建一个值为空的 QSharedPointer(该对象持有对 `nullptr` 的引用)。
[noexcept] template <typename X> QSharedPointer::QSharedPointer(QSharedPointer<X> &&other)
通过移动构造一个 QSharedPointer 实例,使其指向与other 所指向的同一对象。
约束
仅当 `X* ` 可隐式转换为 `T*` 时,才参与重载解析。
[explicit] template <typename X> QSharedPointer::QSharedPointer(X *ptr)
创建一个指向 `ptr` 的 `QSharedPointer`。指针 `ptr ` 将由该 `QSharedPointer` 管理,不得将其传递给另一个 `QSharedPointer` 对象,也不得在此对象外部将其删除。
自 Qt 5.8 起,当对该 QSharedPointer 的最后一个引用被销毁时,ptr 将通过调用X 的析构函数而被删除(即使X 与 QSharedPointer 的模板参数T 不一致)。此前,会调用T 的析构函数。
QSharedPointer::QSharedPointer(const QWeakPointer<T> &other)
通过将弱引用 `other ` 提升为强引用并共享其指针,来创建一个 `QSharedPointer`。
如果T 是本类模板参数的派生类型,QSharedPointer 将执行自动类型转换。否则,将引发编译器错误。
另请参阅 QWeakPointer::toStrongRef()。
QSharedPointer::QSharedPointer(std::nullptr_t)
创建一个值为空的 QSharedPointer。这相当于 QSharedPointer 的默认构造函数。
template <typename X, typename Deleter> QSharedPointer::QSharedPointer(X *ptr, Deleter d)
创建一个指向 `ptr` 的 `QSharedPointer`。指针 `ptr ` 将由该 `QSharedPointer` 管理,不得将其传递给另一个 `QSharedPointer` 对象,也不得在此对象外部将其删除。
deleter 参数d 指定了该对象的自定义删除器。当强引用计数降至 0 时,将调用该自定义删除器,而非 delete() 运算符。例如,这对于在QObject 上调用deleteLater() 非常有用:
static void doDeleteLater(MyObject *obj)
{
obj->deleteLater();
}
void otherFunction()
{
QSharedPointer<MyObject> obj =
QSharedPointer<MyObject>(new MyObject, doDeleteLater);
// continue using obj
obj.clear(); // calls obj->deleteLater();
}请注意,即使 QSharedPointer 的模板参数T 与之不同,自定义删除器函数仍会以指向类型X 的指针作为参数被调用。
也可以直接指定成员函数,例如:
QSharedPointer<MyObject> obj =
QSharedPointer<MyObject>(new MyObject, &QObject::deleteLater);另请参阅 clear()。
template <typename Deleter> QSharedPointer::QSharedPointer(std::nullptr_t, Deleter d)
创建一个值为空的 QSharedPointer。这相当于 QSharedPointer 的默认构造函数。
deleter 参数d 指定了该对象的自定义删除器。当强引用计数降为 0 时,将调用该自定义删除器,而非 operator delete()。
QSharedPointer::QSharedPointer(const QSharedPointer<T> &other)
创建一个 QSharedPointer 对象,该对象共享other 的指针。
如果 `T ` 是本类模板参数的派生类型,则 `QSharedPointer` 将执行自动转换。否则,将会引发编译器错误。
[noexcept] QSharedPointer::QSharedPointer(QSharedPointer<T> &&other)
通过“move”操作构造一个 QSharedPointer 实例,使其指向与other 所指向的同一对象。
QSharedPointer::~QSharedPointer()
销毁此QSharedPointer 对象。如果这是对所存储指针的最后一个引用,则此操作也会删除该指针。
void QSharedPointer::clear()
清除此QSharedPointer 对象,并释放其可能持有的对该指针的引用。如果这是最后一个引用,则该指针本身将被删除。
template <typename X> QSharedPointer<X> QSharedPointer::constCast() const &
执行从该指针类型到X 的const_cast ,并返回一个与该指针共享引用的QSharedPointer 。该函数可用于向上转换和向下转换,但在向上转换时更为实用。
另请参阅 isNull() 和qSharedPointerConstCast()。
[since 6.9] template <typename X> QSharedPointer<X> QSharedPointer::constCast() &&
返回的QSharedPointer 与*this 共享同一组共享所有者。
该函数resets 在成功时会将*this 重定向至nullptr 。
此函数重载了QSharedPointer::constCast()。
该函数在 Qt 6.9 中引入。
另请参见 isNull() 和qSharedPointerConstCast()。
[static] template <typename... Args> QSharedPointer<T> QSharedPointer::create(Args &&... args)
创建一个QSharedPointer 对象,并分配一个类型为T 的新项。QSharedPointer 的内部结构和该对象通过单次内存分配完成,这有助于减少长期运行的应用程序中的内存碎片。
该函数将尝试调用T 类型的构造函数,该构造函数能够接受所有传递的参数(args )。参数将被完全转发。
T *QSharedPointer::data() const
返回该对象所引用的指针的值。
注意:请勿删除该函数返回的指针,也请勿将其传递给可能删除该指针的其他函数,包括创建QSharedPointer 或QWeakPointer 对象。
template <typename X> QSharedPointer<X> QSharedPointer::dynamicCast() const &
将该指针的类型动态转换为X ,并返回一个与该指针共享引用的QSharedPointer 。如果使用此函数进行向上转换,则QSharedPointer 将执行dynamic_cast ,这意味着如果该QSharedPointer 所指向的对象类型不是X ,则返回的对象将为null。
注意:模板类型X 必须与该对象的模板具有相同的 const 和 volatile 限定符,否则类型转换将失败。若需去除这些限定符,请使用constCast()。
另请参阅 qSharedPointerDynamicCast()。
[since 6.9] template <typename X> QSharedPointer<X> QSharedPointer::dynamicCast() &&
返回的QSharedPointer 与*this 共享同一组共享所有者。
该函数在成功时将resets 中的*this 替换为nullptr 。
此函数重载了QSharedPointer::dynamicCast()。
该函数在 Qt 6.9 中引入。
另请参阅 qSharedPointerDynamicCast()。
T *QSharedPointer::get() const
与data() 相同。
提供此函数是为了与std::shared_ptr 保持 API 兼容性。
bool QSharedPointer::isNull() const
如果该对象指向nullptr ,则返回true 。
template <typename X> QSharedPointer<X> QSharedPointer::objectCast() const &
执行从该指针类型到X 的qobject_cast()操作,并返回一个共享该引用的QSharedPointer 。如果使用此函数进行向上转换,则QSharedPointer 将执行qobject_cast ,这意味着如果该QSharedPointer 所指向的对象类型不是X ,则返回的对象将为null。
注意:模板类型X 必须与该对象的模板具有相同的 const 和 volatile 限定符,否则类型转换将失败。若需去除这些限定符,请使用constCast()。
另请参阅 qSharedPointerObjectCast()。
[since 6.9] template <typename X> QSharedPointer<X> QSharedPointer::objectCast() &&
返回的QSharedPointer 与*this 拥有同一组共享所有者。
该函数在成功时将resets 中的*this 替换为nullptr 。
此函数重载了QSharedPointer::objectCast()。
该函数在 Qt 6.9 中引入。
另请参阅 qSharedPointerObjectCast()。
[noexcept, since 6.7] template <typename X> bool QSharedPointer::owner_before(const QSharedPointer<X> &other) const
[noexcept, since 6.7] template <typename X> bool QSharedPointer::owner_before(const QWeakPointer<X> &other) const
仅当该智能指针在实现定义的所有者基于排序中位于other 之前时,才返回 `true `。该排序规则规定:如果两个智能指针均为空,或者它们都拥有同一个对象(即使它们的显式类型和指针不同),则视为等价。
这些函数在 Qt 6.7 中引入。
另请参阅 owner_equal 。
[noexcept, since 6.7] template <typename X> bool QSharedPointer::owner_equal(const QSharedPointer<X> &other) const
[noexcept, since 6.7] template <typename X> bool QSharedPointer::owner_equal(const QWeakPointer<X> &other) const
当且仅当此智能指针与other 共享所有权时,返回true 。
这些函数在 Qt 6.7 中引入。
另请参阅 owner_before 和owner_hash 。
[noexcept, since 6.7] size_t QSharedPointer::owner_hash() const
返回此智能指针对象的基于所有者的哈希值。根据owner_equal 的定义,相等的智能指针将具有相同的基于所有者的哈希值。
这些函数在 Qt 6.7 中引入。
另请参阅 owner_equal 。
void QSharedPointer::reset()
与clear() 相同。用于与 std::shared_ptr 保持兼容性。
void QSharedPointer::reset(T *t)
将此QSharedPointer 对象重置为指向t 。等同于:
QSharedPointer<T> other(t); this->swap(other);template <typename Deleter> void QSharedPointer::reset(T *t, Deleter deleter)
将此QSharedPointer 对象重置为指向t ,并使用Deleterdeleter 。等同于:
QSharedPointer<T> other(t, deleter); this->swap(other);template <typename X> QSharedPointer<X> QSharedPointer::staticCast() const &
将该指针的类型静态转换为X ,并返回一个与该指针共享引用的QSharedPointer 。该函数可用于向上转换和向下转换,但在向上转换时更为实用。
注意:模板类型X 必须与该对象的模板具有相同的 const 和 volatile 限定符,否则强制转换将失败。若需去除这些限定符,请使用constCast()。
另请参阅 dynamicCast()、constCast() 和qSharedPointerStaticCast()。
[since 6.9] template <typename X> QSharedPointer<X> QSharedPointer::staticCast() &&
返回的 `QSharedPointer ` 与 `*this` 共享同一组共享所有者。
该函数在成功时将resets 中的*this 替换为nullptr 。
此函数重载了QSharedPointer::staticCast()。
该函数在 Qt 6.9 中引入。
另请参阅 dynamicCast()、constCast() 和qSharedPointerStaticCast()。
[noexcept] void QSharedPointer::swap(QSharedPointer<T> &other)
将此共享指针实例与other 进行交换。该操作速度极快,且绝不会失败。
QWeakPointer<T> QSharedPointer::toWeakRef() const
返回一个弱引用对象,该对象与本对象引用的指针共享。
另请参阅 ` QWeakPointer::QWeakPointer()`。
QSharedPointer::operator bool() const
如果所包含的指针不是nullptr ,则返回true 。该函数适用于在if-constructs 中使用,例如:
if (sharedptr) { /*...*/ }另请参阅 isNull()。
bool QSharedPointer::operator!() const
如果该对象指向nullptr ,则返回true 。此函数适用于在if-constructs 中使用,例如:
if (!sharedptr) { /*...*/ }另请参阅 isNull()。
T &QSharedPointer::operator*() const
提供对共享指针成员的访问。
如果所包含的指针是nullptr ,则行为未定义。
另请参阅 isNull()。
T *QSharedPointer::operator->() const
提供对共享指针成员的访问。
如果所包含的指针是nullptr ,则行为未定义。
另请参阅 isNull()。
[noexcept] QSharedPointer<T> &QSharedPointer::operator=(QSharedPointer<T> &&other)
将other 通过Move操作赋值给此QSharedPointer 实例。
[noexcept] template <typename X> QSharedPointer<T> &QSharedPointer::operator=(QSharedPointer<X> &&other)
将other 赋值给此QSharedPointer 实例。
约束
仅当X* 可隐式转换为T* 时,才参与重载解析。
QSharedPointer<T> &QSharedPointer::operator=(const QSharedPointer<T> &other)
使该对象与other 共享指针。当前的指针引用将被丢弃;如果这是最后一个引用,则该指针将被删除。
如果T 是本类模板参数的派生类型,QSharedPointer 将执行自动转换。否则,将会引发编译器错误。
QSharedPointer<T> &QSharedPointer::operator=(const QWeakPointer<T> &other)
将 `other ` 提升为强引用,并使该对象与它所引用的指针共享引用。当前的指针引用将被丢弃;如果这是最后一个引用,则该指针将被删除。
如果 `T ` 是本类模板参数的派生类型,则 `QSharedPointer ` 将执行自动类型转换。否则,将引发编译器错误。
相关非成员
[noexcept] template <typename T> size_t qHash(const QSharedPointer<T> &key, size_t seed = 0)
返回key 的哈希值,并使用seed 作为计算的种子。
template <typename X, typename T> QSharedPointer<X> qSharedPointerCast(const QSharedPointer<T> &other)
返回指向other 所持指针的共享指针,该指针已被强制转换为类型X 。要使static_cast 成功,类型T 和X 必须属于同一个类型层次结构。
请注意,X 必须具有与T 相同的 cv 限定符(const 和volatile ),否则代码将无法编译。使用qSharedPointerConstCast 进行强制转换以去除 const 限定。
另请参阅 QSharedPointer::staticCast()、qSharedPointerDynamicCast() 和qSharedPointerConstCast()。
template <typename X, typename T> QSharedPointer<X> qSharedPointerCast(const QWeakPointer<T> &other)
返回指向other 所持指针的共享指针,该指针已被强制转换为X 类型。为了使static_cast 操作成功,T 和X 这两个类型必须属于同一个类型层次结构。
other 对象首先会被转换为强引用。如果该转换失败(因为它所指向的对象已被删除),则该函数返回一个空的QSharedPointer 。
请注意,X 必须与T 具有相同的 cv 限定符(const 和volatile ),否则代码将无法编译。请使用qSharedPointerConstCast 来解除 const 限定。
另请参阅 QWeakPointer::toStrongRef()、qSharedPointerDynamicCast() 和qSharedPointerConstCast()。
[since 6.9] template <typename X, typename T> QSharedPointer<X> qSharedPointerCast(QSharedPointer<T> &&other)
返回的QSharedPointer 与other 共享同一组共享所有者。
该函数resets 在成功时将other 转换为nullptr 。
此函数重载了QSharedPointer::qSharedPointerCast(const QSharedPointer<T> &other)。
该函数在 Qt 6.9 中引入。
另请参阅 QSharedPointer::staticCast()、qSharedPointerDynamicCast() 和qSharedPointerConstCast()。
template <typename X, typename T> QSharedPointer<X> qSharedPointerConstCast(const QSharedPointer<T> &src)
返回指向src 所持指针的共享指针,该指针已被强制转换为X 类型。为了使const_cast 成功,T 和X 这两个类型必须属于同一个类型层次结构。T 和X 之间的const 和volatile 差异将被忽略。
另请参阅 QSharedPointer::constCast()、qSharedPointerStaticCast() 和qSharedPointerDynamicCast()。
template <typename X, typename T> QSharedPointer<X> qSharedPointerConstCast(const QWeakPointer<T> &src)
返回指向src 所持指针的共享指针,并将其强制转换为X 类型。为了使const_cast 操作成功,T 和X 这两个类型必须属于同一个类型层次结构。T 和X 之间的const 和volatile 差异将被忽略。
src 对象首先会被转换为强引用。如果该转换失败(因为它所指向的对象已被删除),则该函数返回一个空的QSharedPointer 。
另请参阅 QWeakPointer::toStrongRef()、qSharedPointerStaticCast(),以及qSharedPointerDynamicCast()。
[since 6.9] template <typename X, typename T> QSharedPointer<X> qSharedPointerConstCast(QSharedPointer<T> &&src)
返回的QSharedPointer 与src 共享同一组共享所有者。
该函数resets 在成功时将src 转换为nullptr 。
此函数重载了QSharedPointer::qSharedPointerConstCast(const QSharedPointer<T> &src)。
该函数在 Qt 6.9 中引入。
另请参阅 QSharedPointer::constCast()、qSharedPointerStaticCast() 和qSharedPointerDynamicCast()。
template <typename X, typename T> QSharedPointer<X> qSharedPointerDynamicCast(const QSharedPointer<T> &src)
返回指向src 所持有指针的共享指针,通过动态转换为类型X 来获取相应类型的内部指针。如果dynamic_cast 失败,则返回的对象将为null。
请注意,X 必须与T 具有相同的 cv 限定符(const 和volatile ),否则代码将无法编译。使用qSharedPointerConstCast 来解除 const 限定。
另请参阅 QSharedPointer::dynamicCast()、qSharedPointerStaticCast() 和qSharedPointerConstCast()。
template <typename X, typename T> QSharedPointer<X> qSharedPointerDynamicCast(const QWeakPointer<T> &src)
返回指向src 所持有指针的共享指针,通过动态转换为X 类型来获取适当类型的内部指针。如果dynamic_cast 失败,则返回的对象将为null。
src 对象首先会被转换为强引用。如果该转换失败(因为它所指向的对象已被删除),则该函数也会返回一个为 null 的QSharedPointer 。
请注意,X 必须与T 具有相同的 cv-限定符(const 和volatile ),否则代码将无法编译。请使用qSharedPointerConstCast 来解除 const 限定。
另请参阅 QWeakPointer::toStrongRef()、qSharedPointerStaticCast() 和qSharedPointerConstCast()。
[since 6.9] template <typename X, typename T> QSharedPointer<X> qSharedPointerDynamicCast(QSharedPointer<T> &&src)
返回的QSharedPointer 与src 共享同一组共享所有者。
该函数resets 在成功时将src 转换为nullptr 。
此函数重载了QSharedPointer::qSharedPointerDynamicCast(const QSharedPointer<T> &src)。
该函数在 Qt 6.9 中引入。
另请参阅 QSharedPointer::dynamicCast()、qSharedPointerStaticCast()和qSharedPointerConstCast()。
template <typename X, typename T> QSharedPointer<X> qSharedPointerObjectCast(const QSharedPointer<T> &src)
qSharedPointerObjectCast 函数用于将指针转换为共享指针。
该函数返回一个指向 `src` 所持有指针的共享指针,通过调用 `qobject_cast()` 将 `X ` 转换为适当类型的内部指针。如果 `qobject_cast ` 调用失败,则返回的对象将为 `null`。
请注意,X 必须与T 具有相同的 cv 限定符(const 和volatile ),否则代码将无法编译。使用qSharedPointerConstCast 来解除 const 限定。
另请参阅 QSharedPointer::objectCast()、qSharedPointerStaticCast() 和qSharedPointerConstCast()。
template <typename X, typename T> QSharedPointer<X> qSharedPointerObjectCast(const QWeakPointer<T> &src)
qSharedPointerObjectCast 函数用于将共享指针进行类型转换。
该函数返回一个指向 `src` 所持有指针的共享指针,具体操作是使用 `qobject_cast()` 将 `X ` 转换为适当类型的内部指针。如果 `qobject_cast ` 操作失败,则返回的对象将为 `null`。
src 对象首先会被转换为强引用。如果该转换失败(因为其所指向的对象已被删除),则该函数也会返回一个为 null 的QSharedPointer 。
请注意,X 必须具有与T 相同的 cv 限定符(const 和volatile ),否则代码将无法编译。请使用qSharedPointerConstCast 来解除 const 限定。
另请参阅 QWeakPointer::toStrongRef()、qSharedPointerStaticCast() 和qSharedPointerConstCast()。
template <typename X, typename T> std::shared_ptr<X> qSharedPointerObjectCast(const std::shared_ptr<T> &src)
返回指向src 中保存的指针的共享指针,通过将qobject_cast()应用于类型X 来获取相应类型的内部指针。如果qobject_cast 失败,则返回的对象将为null。
请注意,X 必须与T 具有相同的 cv 限定符(const 和volatile ),否则代码将无法编译。请使用 const_pointer_cast 去除 const 限定符。
template <typename X, typename T> std::shared_ptr<X> qSharedPointerObjectCast(std::shared_ptr<T> &&src)
返回指向src 所持指针的共享指针,通过qobject_cast()将类型转换为X ,从而获得相应类型的内部指针。
如果 `qobject_cast ` 成功,该函数将返回一个有效的共享指针,且 `src ` 将被重置为 `null`。如果 `qobject_cast ` 失败,返回的对象将为 `null`,且 `src ` 不会被修改。
请注意,X 必须与T 具有相同的 cv 限定符(const 和volatile ),否则代码将无法编译。请使用 const_pointer_cast 来解除 const 限定。
[since 6.9] template <typename X, typename T> QSharedPointer<X> qSharedPointerObjectCast(QSharedPointer<T> &&src)
返回的QSharedPointer 与src 共享同一组共享所有者。
该函数resets 在成功时将src 转换为nullptr 。
此函数重载了QSharedPointer::qSharedPointerObjectCast(const QSharedPointer<T> &src)。
该函数在 Qt 6.9 中引入。
另请参阅 QSharedPointer::objectCast()、qSharedPointerStaticCast() 和qSharedPointerConstCast()。
[since 6.12] template <typename X, typename T> QSharedPointer<X> qSharedPointerStaticCast(const QSharedPointer<T> &other)
返回一个指向other 所持指针的共享指针,该指针已被强制转换为类型X 。为了使static_cast 操作成功,类型T 和X 必须属于同一个类型层次结构。
请注意,X 必须与T 具有相同的 cv 限定符(const 和volatile ),否则代码将无法编译。使用qSharedPointerConstCast 来解除 const 限定。
该函数在 Qt 6.12 中引入。
另请参阅 QSharedPointer::staticCast()、qSharedPointerDynamicCast() 和qSharedPointerConstCast()。
[since 6.12] template <typename X, typename T> QSharedPointer<X> qSharedPointerStaticCast(const QWeakPointer<T> &other)
返回指向other 所持指针的共享指针,该指针已被强制转换为X 类型。为了使static_cast 操作成功,T 和X 这两个类型必须属于同一个类型层次结构。
other 对象首先会被转换为强引用。如果该转换失败(因为它所指向的对象已被删除),则该函数将返回一个空的QSharedPointer 。
请注意,X 必须与T 具有相同的 cv-限定符(const 和volatile ),否则代码将无法编译。请使用qSharedPointerConstCast 来解除 const 限定。
该函数在 Qt 6.12 中引入。
另请参阅 QWeakPointer::toStrongRef()、qSharedPointerDynamicCast() 和qSharedPointerConstCast()。
[since 6.12] template <typename X, typename T> QSharedPointer<X> qSharedPointerStaticCast(QSharedPointer<T> &&other)
返回的QSharedPointer 与other 拥有同一组共享所有者。
该函数在成功时将resets other 转换为nullptr 。
此函数重载了QSharedPointer::qSharedPointerStaticCast(const QSharedPointer<T> &other)。
该函数在 Qt 6.12 中引入。
另请参阅 QSharedPointer::staticCast()、qSharedPointerDynamicCast() 和qSharedPointerConstCast()。
template <typename X, typename T> std::shared_ptr<X> qobject_pointer_cast(const std::shared_ptr<T> &src)
返回指向src 所持指针的共享指针。
与qSharedPointerObjectCast() 相同。提供此函数是为了兼容 STL。
template <typename X, typename T> std::shared_ptr<X> qobject_pointer_cast(std::shared_ptr<T> &&src)
与 `qSharedPointerObjectCast()` 相同。提供此函数是为了兼容 STL。
template <typename T, typename X> bool operator!=(const QSharedPointer<T> &lhs, const QSharedPointer<X> &rhs)
如果lhs 和rhs 指向不同的指针,则返回true 。
如果rhs 的模板参数与lhs 的不同,QSharedPointer 首先需要确保它们是兼容的类型。它将尝试执行自动的static_cast ,将类型T 和X 转换为它们的复合指针类型。如果rhs 的模板参数不是lhs 的基类或派生类,则会引发编译器错误。
template <typename T, typename X> bool operator!=(const QSharedPointer<T> &lhs, const X *rhs)
如果lhs 和rhs 指向不同的指针,则返回true 。
如果rhs 的模板参数与lhs 的不同,QSharedPointer 首先需要确保它们是兼容的类型。它将尝试执行自动static_cast ,将类型T 和X 转换为它们的复合指针类型。如果rhs 的模板参数不是lhs 的基类或派生类,则会引发编译器错误。
template <typename T> bool operator!=(const QSharedPointer<T> &lhs, std::nullptr_t)
如果 `lhs ` 指向一个有效的(即非空的)指针,则返回 `true `。
另请参阅 QSharedPointer::isNull()。
template <typename T, typename X> bool operator!=(const T *lhs, const QSharedPointer<X> &rhs)
如果指针lhs 与rhs 所引用的指针不相同,则返回true 。
如果rhs 的模板参数与lhs 的不同,QSharedPointer 首先需要确保它们是兼容的类型。它将尝试执行自动static_cast ,将类型T 和X 转换为其复合指针类型。如果rhs 的模板参数不是lhs 的基类或派生类,则会引发编译器错误。
template <typename T> bool operator!=(std::nullptr_t, const QSharedPointer<T> &rhs)
如果rhs 指向一个有效的(即非空的)指针,则返回true 。
另请参阅 QSharedPointer::isNull()。
template <typename T> QDebug operator<<(QDebug debug, const QSharedPointer<T> &ptr)
将由ptr 跟踪的指针写入调试对象debug ,以供调试之用。
另请参阅 “调试技术”。
template <typename T, typename X> bool operator==(const QSharedPointer<T> &lhs, const QSharedPointer<X> &rhs)
如果lhs 和rhs 指向同一个指针,则返回true 。
如果rhs 的模板参数与lhs 的不同,则QSharedPointer 首先需要确保它们是兼容的类型。它将尝试执行自动static_cast ,将类型T 和X 转换为它们的复合指针类型。如果rhs 的模板参数不是lhs 的基类或派生类,则会引发编译器错误。
template <typename T, typename X> bool operator==(const QSharedPointer<T> &lhs, const X *rhs)
如果lhs 和rhs 指向同一个指针,则返回true 。
如果rhs 的模板参数与lhs 的不同,则QSharedPointer 首先需要确保它们是兼容的类型。它将尝试执行自动static_cast ,将类型T 和X 转换为它们的复合指针类型。如果rhs 的模板参数不是lhs 的基类或派生类,则会引发编译器错误。
template <typename T> bool operator==(const QSharedPointer<T> &lhs, std::nullptr_t)
如果lhs 指向nullptr ,则返回true 。
另请参阅 QSharedPointer::isNull()。
template <typename T, typename X> bool operator==(const T *lhs, const QSharedPointer<X> &rhs)
如果指针lhs 与rhs 所引用的指针相同,则返回true 。
如果rhs 的模板参数与lhs 的不同,则QSharedPointer 首先需要确保它们是兼容的类型。它将尝试执行自动static_cast ,将类型T 和X 转换为它们的复合指针类型。如果rhs 的模板参数不是lhs 的基类或派生类,则会引发编译器错误。
template <typename T> bool operator==(std::nullptr_t, const QSharedPointer<T> &rhs)
如果rhs 指向nullptr ,则返回true 。
另请参阅 QSharedPointer::isNull()。
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.