c++类型转换

本文详细介绍了C++中的四种类型转换操作符:static_cast、reinterpret_cast、const_cast和dynamic_cast,以及智能指针转换函数static_pointer_cast、dynamic_pointer_cast和const_pointer_cast的用法和注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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);

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值