使用四种变幻方便在转换出现错误的时候检查错误,比如说,我只查询_cast关键字就能得到左右的类型转化位置。
同时,四种变还也能保证变幻的安全性。
简述- static_cast
static_cast不能用于不同类型的指针、不同类型的引用、整形和指针之间的转换,可以用于整形、浮点形、字符之间的相互转换。基本上就是用于静态类型的转换(没有虚函数,不是多态类) - const_cast 主要用于将const常量属性去掉和增加const属性
使用方法:
type expr = const_cast(expression) // type只有三种选择: reference(引用), pointer-to-object(指向对象指针), pointer-to-data-member(指向数据的指针)
在四种强制转换中,只有他能脱掉或加上const属性,脱掉const属性时其他的方法会报错(如果你使用(type)这种形式的强制转换为指针或者引用,其实也能将const去掉),但是加上const属性时,这四种方法都可以
例如:
#includeusing namespace std; class Base { public: virtual void f1(){} }; class Child : public Base { public: virtual void f1(){} }; int main() { //去掉const const Base s; Base& p = const_cast (s); // 不包错 Base& p = reinterpret_cast (s); //报错 Base& p = dynamic_cast (s); //报错 Base& p = (Base &)(s); //不报错 // 添加const Base bb; // const Base &p = (const Base &)bb; //成功 // const Base &p = const_cast (bb);//成功 // const Base &p = dynamic_cast (bb); //成功 // const Base &p = reinterpret_cast (bb); //成功 // const Base &p = static_cast (bb); //成功 return 0; }
- reinterpret_cast
用于不同类型指针之间、不同类型引用之间、整数和指针之间的转换,这种转换是逐bit的进行转换,转换的过程其实是可能会引发一些错误,在转换的过程中,程序是不会提示的。
比如将基类指针转化为派生类指针,实际上就会产生错误、再或者没有多态的基类和派生类在派生类转换为基类的时候,其调用的函数都会是基类的函数,这回产生一些逻辑错误,这种错误实际上可以通dynamic_cast来进行避免。 - dynamic_cast
可以对进行转化的指针、引用进行检查,如果出现错误的话,其返回的指针就会为空!在基类中没有实现多态的话,那么转化的过程中会直接编译不通过。所以dynamic_cast用于实现了多态的类
#includeusing namespace std; class Base { public: int xx ; Base(){ this->xx = 10; } virtual void f1(){} }; class Child : public Base { public: virtual void f1(){} }; int main() { Base * pb; Child * pc; Base b; Child c; // dynamic_cast<> // pb = reinterpret_cast (&c); pb = dynamic_cast (&c); if(pb == NULL)cout<<"派生类转化为基类错误"< (&b); pc = dynamic_cast (&b); if(pc == NULL)cout<<"基类转化为派生类出现错误"< 参考自:
6. const_cast - 胖子许木木的文章 - 知乎
7. (C++ 成长记录) —— C++强制类型转换运算符(static_cast、reinterpret_cast、const_cast和dynamic_cast) - 赵萱婷的文章 - 知乎



