1. 类型转换操作符
1.1 static_cast
这是最通用的类型转换操作符,可以在相关类型之间进行转换,例如从基类指针转换为派生类指针,或者在整型和浮点型之间转换。但是,它不能删除const、volatile或者mutable修饰符,也不能在无关的类型之间进行转换(例如从一个整数到一个指针,或者从一个指针到一个不相关的指针)。所以尽量应该避免在无关的类型之间的转换。
1.2 reinterpret_cast
这是最不安全的类型转换操作符 ,可以在任何两种类型之间进行转换,包括无关的类型。它主要用于底层编程任务,例如操作硬件或者操作系统API。在一般的应用程序代码中,它的使用应该是非常罕见的。
1. 3const_cast
这个类型转换操作符可以添加或删除const、volatile或者mutable修饰符。它是唯一一个能够做这件事情的类型转换操作符。然而,对于已经声明为const的对象,使用const_cast来删除const修饰符并修改它的值是未定义行为。
1.4 dynamic_cast
主要用于在类的继承层次结构中进行安全转换。它用于将基类的指针或引用转换为派生类的指针或引用。转换成功的前提是所指对象的类型确实是目标类型。如果转换失败,例如试图将基类指针转换为不正确的派生类指针,那么dynamic_cast将返回空指针。这种转换在运行时进行,因此会有一些性能开销。因此,dynamic_cast主要应用在需要在运行时判断对象类型的情况下。
这四种类型转换操作符提供了C++中类型转换的全部功能。static_cast和reinterpret_cast可以在编译时进行类型转换,而dynamic_cast则在运行时进行类型检查。
2. 智能指针转换函数
这些函数用于将一个类型的智能指针转换为另一个类型的智能指针。注意操作对象是智能指针。
2.1 static_pointer_cast
这个函数主要用于向下转型,也就是将基类指针转换为派生类指针。
std::shared_ptr<Base> basePtr = std::make_shared<Derived>();
std::shared_ptr<Derived> derivedPtr = std::static_pointer_cast<Derived>(basePtr);
如果basePtr
实际指向的是一个Derived
对象,那么这个转换是安全的。否则,derivedPtr
将指向一个无效的对象。
2.2 dynamic_pointer_cast
这个函数和std::dynamic_cast
类似,也就是说,如果转换失败,它会返回一个空的std::shared_ptr
。这个函数主要用于在运行时检查向下转型是否合法。
std::shared_ptr<Base> basePtr = std::make_shared<Base>();
std::shared_ptr<Derived> derivedPtr = std::dynamic_pointer_cast<Derived>(basePtr);
if (derivedPtr) {
// 转换成功
} else {
// 转换失败
}
2.3 const_pointer_cast
可以将其参数(一个std::shared_ptr
)转换为另一个std::shared_ptr
类型,同时添加或者删除const
修饰符。这个函数等价于std::shared_ptr
的构造函数,即它创建一个新的std::shared_ptr
,新的std::shared_ptr
和原来的std::shared_ptr
共享同一个对象。
std::shared_ptr<const int> constPtr = std::make_shared<int>(42);
std::shared_ptr<int> ptr = std::const_pointer_cast<int>(constPtr);