reinterpret_cast,static_cast, dynamic_cast,const_cast的运用分析
reinterpret_cast(重新解释类型转换)
reinterpret_cast 最famous的特性就是什么都可以,转换任意的类型,包括C++所有通用类型,所以也最不安全
- 应用
-
整形和指针之间的相互转化
-
指针和引用转化为任意类型的指针和引用
- 示例
class a;
class b:a;
class c;
b& ref_b = reinterpret_cast<b&>c; //编译可以通过
static_cast(静态类型转换)
static_cast 只提供编译时的类型安全,但对于动态类型下的继承关系指针转换,不提供安全的类型检查
- 应用
- void指针转换成其他类型指针
- 通常类型的标准转换
- 避免出现可能多种转换的歧义
- 示例
class a;
class b:a;
class c;
a* p = static_cast<a*>(b);//编译可通过
a* p = static_cast<a*>(c);//编译不可通过
dynamic_cast(重新解释类型转换)
在上行转换中,static_cast和dynamic_cast效果是一样的,而且都比较安全,因为向上转换的对象一般是指向子类对象的子类类型指针;而在下行转换中,由于可以定义就不同了指向子类对象的父类类型指针,同时static_cast只在编译时进行类型检查,而dynamic_cast是运行时类型检查
如果一条dynamic_cast语句的转换目标是指针类型并且转换失败了,会返回一个空指针,则判断条件为0,即为false;如果转换成功,指针为非空,则判断条件为非零,即true。
引用类型的dynamic_cast和指针类型的dynamic_cast在表示错误发生的方式上略有不同。因为不存在空引用,所以对于引用类型来说无法使用与指针类型完全相同的错误报告策略。当对引用类型转换失败时,程序抛出一个名为std::bad_cast的异常,该异常定义在typeinfo标准库头文件中。
- 应用
- 用于类层次结构中的父类和子类之间指针和引用的转换。(指针和引用转换在使用时对于返回方式有不同的调用方法)
- 示例
//指针转换
class a;
class b:a;
class c;
a* p = dynamic_cast<a*>(b);// p返回正常指针
b* p = static_cast<b*>(a);// p返回NUll
a* p = static_cast<a*>(c);// p返回NUll
if(a && b && c)
...
//引用转换
class a;
class b:a;
class c;
try{
a& p = static_cast<a&>(c);
}
catch(bad_cast){}
const_cast(常类型转换)
const_cast是把const或者volatile属性去掉
-
应用
变量和函数为const或volatile -
示例
struct SA
{
int i;
};
const SA ra;
//ra.i = 10; //直接修改const类型,编译错误
SA &rb = const_cast<SA&>(ra);
rb.i = 10;