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(pData);
  }

dynamic_cast

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

指针类型:

    Derived *dp = dynamic_cast(bp);

引用类型:

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

const_cast

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

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

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

volatile int p = 0;
int &k = const_cast(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(t);

你可能感兴趣的:(C++,个人mark,C++)