std::static_pointer_cast
是 C++11 引入的一个模板函数,用于将智能指针(例如 std::shared_ptr
或 std::weak_ptr
)从一种类型强制转换为另一种类型。它与 static_cast
类似,但专门用于智能指针。
语法:
std::shared_ptr<TargetType> std::static_pointer_cast<TargetType>(const std::shared_ptr<SourceType>& r);
TargetType
:目标类型,指你希望将智能指针转换为的类型。SourceType
:源类型,指智能指针当前所指向的类型。r
:要转换的智能指针对象。
作用:
- 类型转换:将一个智能指针从一种类型转换为目标类型,类似于
static_cast
但用于智能指针。 - 智能指针管理功能保留:转换后的指针仍然是智能指针,它保留了引用计数和自动管理内存的功能。
使用场景:
- 你知道对象的真实类型并且想要在不丢失智能指针管理功能的情况下对其进行转换。
- 可以在继承层次中进行转换,如从基类智能指针向派生类智能指针的转换,或者在相关类型之间进行转换。
示例:
1. 父类指针转换为子类指针:
假设有一个父类 Base
和子类 Derived
,Base
指针指向的是一个 Derived
对象,想将 std::shared_ptr<Base>
转换为 std::shared_ptr<Derived>
。
#include <iostream>
#include <memory>
class Base {
public:
virtual void show() { std::cout << "Base class" << std::endl; }
};
class Derived : public Base {
public:
void show() override { std::cout << "Derived class" << std::endl; }
};
int main() {
// 创建 Derived 对象并将其指针存储在 shared_ptr<Base> 中
std::shared_ptr<Base> base_ptr = std::make_shared<Derived>();
// 将 Base 类型的智能指针转换为 Derived 类型
std::shared_ptr<Derived> derived_ptr = std::static_pointer_cast<Derived>(base_ptr);
// 通过 derived_ptr 调用 Derived 的方法
derived_ptr->show(); // 输出:Derived class
}
2. 在相关类型之间进行转换:
#include <iostream>
#include <memory>
class A {
public:
virtual void print() { std::cout << "A" << std::endl; }
};
class B : public A {
public:
void print() override { std::cout << "B" << std::endl; }
};
int main() {
std::shared_ptr<A> ptrA = std::make_shared<B>(); // 将 B 对象存储为 A 类型的智能指针
std::shared_ptr<B> ptrB = std::static_pointer_cast<B>(ptrA); // 转换为 B 类型智能指针
ptrB->print(); // 输出:B
}
与 dynamic_pointer_cast
的区别:
std::static_pointer_cast
:用于在你明确知道对象类型并且类型转换不会失败的情况下。它不检查对象是否真的能被转换,转换时必须是安全的。std::dynamic_pointer_cast
:用于在运行时进行类型检查。它可以在多态类型之间进行安全的类型转换,如果转换失败会返回nullptr
。
示例:
std::shared_ptr<Derived> derived_ptr = std::dynamic_pointer_cast<Derived>(base_ptr);
在这里,dynamic_pointer_cast
会在运行时检查 base_ptr
是否指向 Derived
类型的对象,只有在检查成功的情况下才会返回转换后的指针。
总结:
std::static_pointer_cast
是用于智能指针类型间的编译时强制转换,不会在运行时进行检查。- 它的用法与
static_cast
类似,但不会丢失智能指针的内存管理功能。 - 适用于继承层次中从基类指针转换为派生类指针的场景。
🎯 关键点:在使用 static_pointer_cast
时,确保类型转换是合法的,否则可能会导致未定义行为。