参考资料:
斯坦福CS106L full_course_reader.pdf
C语言的类型转化过于强大,同样也过于危险。
比如下面两种完全不相关的类型指针也可以进行转化。
Base* myBasePtr; // Assume we know that this points to a Derived object.
vector<double>* myVectorPtr = (vector<double> *)myBasePtr; // Uh oh!
下面const直接被去掉
const Base* myBasePtr; // Assume we know that this points to a Derived object.
Derived* myDerivedPtr = (Derived *)myBasePtr;
static_cast:
跟上面差不多,但是会在编译的时候检查是否合理
1、在基本类型之间转化,int float char double
2、子类和父类之间转化,会保留const。
但是父类转化为子类,如果调用子类的一些方法(但实际的父类对象是不存在这些方法的),那么会出问题,static_cast不能解决这个问题。这个时候要用dynamic_cast。
dynamic_cast:
跟static_cast差不多,但是父类指针转化为子类指针的时候会返回NULL,不会成功。但是会慢一些。转化引用失败的时候,会变成bad_cast对象。
reinterpret_cast:强制类型转换
char *指针转化为int *指针,但保留const
const char* myPtr = /* ... */
const int* myIntPtr = reinterpret_cast<const int*>(myPtr);
const_cast:去掉const类型
再去掉const
const char* myPtr = /* ... */
int* myIntPtr = const_cast<int*>(reinterpret_cast<const int*>(myPtr));