static_cast, dynamic_cast, const_cast, reinterpret_cast 区别

static_cast 相当于传统的C语言里的强制转换,用于非多态的转换,可以转换指针及其其他,但是没有运行时类型检查来保证转换的安全性。

用法:

  1. 用于基本数据类型之间的转换, int 转 char, char* 转void*等
  2. 基类和派生类之间的指针或引用转换
  3. 不能转换含有const、volatile属性的变量
  4. 把派生类的指针或引用转换成基类表示是安全的
    示例:
OnEventData(void* pData){
       EventData *evdata = static_cast<EventData*>(pData);
  }

dynamic_cast

主要用于类层次之间的转换,有类型检查功能,但是消耗性能。派生类转基类表示是安全的,基类转派生类表示有类型检查。dynamic_cast转换目标是指针且失败了,则结果为nullptr; 如果转换目标是引用类型且失败了,则抛出std::bad_cast异常。

指针类型:

    Derived *dp = dynamic_cast<Derived*>(bp);

引用类型:

void func(const Base &b){
    try{
        const Derived &d = dynamic_cast<const Base&>(b);
    }catch(std::bad_cast){
    }
}

const_cast

去掉变量的const 以及 volatile关键字的作用

const int con = 1;
const int* cp = &con;
int *mdf = const_cast<int*>(cp);
*mdf = 2;

const int i = 1;
int &k = const_cast<int &>(i);

volatile int p = 0;
int &k = const_cast<int &>(p);

reinterpret_cast

reinterpret_cast(expression), 如果type-name 和expression 的位数一样,则可以进行转换,其安全性完全由程序员控制。C语言的强制转换会忽略位数限制。

type-name 和 expression 必须有一个是指针类型。 是将expression的二进制复制到新的值。

    int f = 80;
    int *t = &f;
    unsigned int  *ps = reinterpret_cast<unsigned int*>(t);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值