分类
c++存在四种显式类型转换,分别是
- static_cast 静态转换
- dynamic_cast 动态转换
- const_cast 常量转换
- reinterpret_cast 强制转换
static_cast
简介
任何具有明确定义的类型转换,只要不包含底层const,都可以使用static_cast.如
int i, j;
double slope = static_cast<double>(j)/i
使用场景
- 把较大的算术类型赋值给较小的类型时,static_cast非常有用。此情况下一般会损失精度,使用static_cast类型转换后,告警信息就会消失
- 对于编译器无法自动执行的类型转换也非常有用,如可以用static_cast找回存在于void*指针
void *p = &d;
double *dp = static_cast<double*>(p);
转换的结果与原始地址相等,因此必须保证转换后的类型就是指针所指的类型
dynamic_cast
简介
用于将基类的指针或引用安全的转换成派生类的指针活引用 使用形式如下:
dynamic_cast<type*>(e);
dynamic_cast<type&>(e);
dynamic_cast<type&&>(e);
使用场景
- 基类的函数不是虚函数,但是基类的指针需要执行派生类定义的函数时
假设Base类至少包含一个虚函数,Derived是Base的公有派生类,如果有一个指向Base的指针bp,则我们可以在运行时将其转换成指向Derived的指针,具体代码如下:
if(Derived *dp = dynamic_cast<Derived*>(bp))
{
//使用dp指向的Derived对象
}else{
//使用bp指向的Base对象
}
const_cast
简介
const_cast只能改变运算对象底层的const
const char *pc;
char *p = const_cast<char*>(pc);
如果对象本身不是一个常量,使用强制类型转换获得读写权限是合法行为,如果对象是一个常量,再使用const_cast执行读写操作会产生未定义的后果
使用场景
- 用户有函数重载的上下文中
reinterpret
简介
通常为运算对象的位模式提供较低层次上的重新解释
使用场景
- 尽量不要使用,使用时必须对涉及的类型和编译器实现转换的过程都非常了解