const_cast:
去掉const属性
const int base = 1;
//int *b = &base ; //编译错误
int *b = const_cast<int *>(&base) ;
dynamic_cast:
只能用于指针和引用的转换,
可以将父类指针转换成对应的子类指针,但是在向下转换的时候父类一定要有虚函数,否则会编译错误,
如果是转换失败,指针的转换会返回null,引用的转换会抛出异常。
class base {
public:
base();
virtual ~base();//父类需要有虚函数
};
class derive : public base {
public:
};
void dynamic_cast_test()
{
base *a = new base ;
derive *b = dynamic_cast<derive *>(a);//如果转换失败返回NULL
}
static_cast:
可以实现基本类型之间的相互转换,
可以实现空类型指针到其他类型指针的转换,
可以实现子类和父类之间的互相转换,
可以实现任何类型转换成void类型。
reinterpret_cast:
可以实现不相关类型的转换,简单的实现二进制的拷贝,并不作任何类型检查,
所以类似于int转向double的情况,就会出问题,因为只是简单的将4个字节的二进制转换给double,而并不满足double的二进制保存方式,
在自己的编译器测试,编译不通过
int aa = 1;
int *a = &aa;
double *b = reinterpret_cast<double *>(a) ;//这样得到的结果并不是1,而是将整数型的二进制使用浮点型格式解释