static_cast 相当于传统的C语言里的强制转换,用于非多态的转换,可以转换指针及其其他,但是没有运行时类型检查来保证转换的安全性。
用法:
- 用于基本数据类型之间的转换, int 转 char, char* 转void*等
- 基类和派生类之间的指针或引用转换
- 不能转换含有const、volatile属性的变量
- 把派生类的指针或引用转换成基类表示是安全的
示例:
OnEventData(void* pData){
EventData *evdata = static_cast<EventData*>(pData);
}
dynamic_cast
主要用于类层次之间的转换,有类型检查功能,但是消耗性能。派生类转基类表示是安全的,基类转派生类表示有类型检查。dynamic_cast转换目标是指针且失败了,则结果为nullptr; 如果转换目标是引用类型且失败了,则抛出std::bad_cast异常。
指针类型:
Derived *dp = dynamic_cast<Derived*>(bp);
引用类型:
void func(const Base &b){
try{
const Derived &d = dynamic_cast<const Base&>(b);
}catch(std::bad_cast){
}
}
const_cast
去掉变量的const 以及 volatile关键字的作用
const int con = 1;
const int* cp = &con;
int *mdf = const_cast<int*>(cp);
*mdf = 2;
const int i = 1;
int &k = const_cast<int &>(i);
volatile int p = 0;
int &k = const_cast<int &>(p);
reinterpret_cast
reinterpret_cast(expression), 如果type-name 和expression 的位数一样,则可以进行转换,其安全性完全由程序员控制。C语言的强制转换会忽略位数限制。
type-name 和 expression 必须有一个是指针类型。 是将expression的二进制复制到新的值。
int f = 80;
int *t = &f;
unsigned int *ps = reinterpret_cast<unsigned int*>(t);