Senior Dogsbody Engineer  

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语句对其转换成功与否进行测试。

共有继承且有虚函数的下行转换,否则报错。

 

posted on   高级打杂工程师  阅读(43)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
 
点击右上角即可分享
微信分享提示