1. 去常转换 const_cast
把常量指针或引用转换为非常量指针或引用,或者反之,并仍然指向原来的对象。强制转换类型必须是指针或引用。
const int a = 10; const int &b = 20; int& ra = const_cast<int&> (a); // 把常量引用转换为非常量引用 int* p = const_cast<int*> (&b); // 把常量指针转换为非常量指针 int c = const_cast<int>(a); // 错误,转换类型必须是指针或引用 int d = const<int>(b);// 错误,转换类型必须是指针或引用
2. 静态转换 static_cast
只能在内置的数据类型之间相互转换,对于类只能在有联系的指针类型间进行转换。
用于基本类型间的转换,不能用于基本类型指针间的转换。
对于有继承关系类对象之间的转换,派生类指针或引用转换成基类(上行转换)时安全,基类指针或引用转换成派生类(下行转换)时不安全。
class
int a = 10; int b = 20; float ft = 12.25f; b = static_cast<float>(ft); int* ip = static_cast<int*>(&ft); // 错误,不能用于基本类型指针间的转换
class Base
{
};
class Derived : public Base
{
};
class AnotherDerived : public Base
{
};
class Other
{
};
Derived objDerived;
Derived* pDerived = new Derived;
Base objBase;
Base* pBase = new Base;
AnotherDerived* pAnotherDerived = new AnotherDerived;
Other* pOther = new Other;
objBase = static_cast<Base&>(objDerived); //转换为基类引用
objBase = static_cast<Base>(objDerived);
objDerived = static_cast<Derived>(objBase);// 错误,不能进行转换
pBase = pDerived; // 基类指针指向派生类指针
pDerived = objBase; // 错误, 派生类指针指向基类对象
pBase = static_cast<Base*>(pDerived);
pDerived = static_cast<Derived*>(pBase);
pAnotherDerived = static_cast<AnotherDerived*>(pDerived); // 错误, 两个类不是基类与之类的关系
pOther = static_cast<Other*>(pDerived); //错误,无关联的两个类之间不能转换
对void*的转换,不安全。
int a = 10; void* pv = &a; float* pf = static_cast<float*>(pi);// 不安全,当读取*pf的值时会扩大读取的字节个数,造成读取数据错误的情况
3. 重新解释 reinterpret_cast
任何指针都可以转换成其他类型的指针,不安全的转换。必须是一个指针,引用,算术类型,指向函数的指针或指向一个类成员的指针。
class Base{}; class Test{}; int a = 10; float* pf = reinterpret_cast<float*>(&a); Base b; Test* pt = reinterpret_cast<Test*>(&b); // 不安全
4. 动态转换 dynamic_cast
只能用于指针或引用,只能用于含有虚函数的类。 执行转换时首先检查能否转换成功,如果能成功则转换之,如果转换失败,指针返回一个nullptr,引用抛出bad_cast异常。所以在使用dyanmic_cast转换之前应使用if语句对其转换成功与否进行测试。
共有继承且有虚函数的下行转换,否则报错。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本