static_cats
1.可以实现C++中内置基本数据类型之间的转换,enum,struct,int,char,float等。
int a = static_cast(7.987);
2.static_cast在相互联系的类型中转换,不一定包含虚函数。例如基类和子类之间的转换:其中,子类转换成父类指针是安全的,父类转化成子类是不安全的。(基类与子类之间的转换建议用dynamic_cast)
3.唯一一个可以用于类对象(非指针)转换的运算符,但仍然必须是子类和基类之间。
const_cast
用于取出const属性,把const类型的指针变为非const类型的指针,如:const int * fun(int x,inty){} int *ptr=const_cast<int *>fun(2,3)(针对指针)
dynamic_cast
1.其它三种都是编译时候完成的,dynamic_cast是在运行时候处理,运行时候要检查类型。
2.不能用于内置数据类型的转换。
3.dynamic_cast如果转换成功,返回的是指向类的指针或引用。转换不成,则返回NULL。
4.使用dynamic_cast转换,基类中一定含有虚函数,否则编译不通过。原因为只有存在虚函数,说明该基类有基类指针或引用指向派生类的情况,此时转换才有意义。而这个信息存储在虚函数表中,只有定义了虚函数,才会有虚函数表。
5.在类之间的转换,由下往上装换的dynamic_cast和static_cast效果是一样的。在由上往下进行转换时候,dynamic_cast比static_cast更安全,dynamic_cast会进行类型检查。检查类型错误可以返回NULL。
reinterpret_cast
将一个指针类型转换为其它指针类型,新类型的指针可以和旧类型的指针毫不相关,但他们存在潜在风险,因此被很少使用。如int* 与之间的转换float*会导致数据不能被完整的读取。