本节介绍四个强制类型转换运算符:const_cast
、reinterpret_cast
、static_cast
和dynamic_cast
。
1. const_cast转换符
使用表达式const_cast<T>(v)
可以更改指针或者引用的const或者volatile限定符
。T必须是指针、引用或者指向成员的指针类型。
1 | class A |
2. reinterpret_cast
例如pointer和int 的无关类型的转换。
reinterpret_cast
- 转换的类型必须是一个指针、引用、算术类型、函数指针或者成员指针。
- 在比特位级上进行转换。它可以把一个指针转换成一个整数,反过来亦可。
- 最普通的用法就是函数指针类型之间进行转换。
- 很难保证移植性。此强制转换运算符不是通用的,因此,它不能保证可移植到其它编译器。
1 | const char* str = "hello"; |
3. static_cast转换
用法:
static_cast
static_cast
可用于将指向基类的指针转换为指向派生类的指针等操作,该类型转换并非始终安全。
- 基类和父类之间的转换。子类指针转换成父类指针时安全的,但是父类指针指向子类指针时不安全的。(基类和子类的动态类型转换建议使用dynamic_cast)
- 基本类型转换。其中static_cast不能进行无关类型(如非基类和子类)指针之间的转换。
- 将空指针转换成目标类型的空指针
- 任何类型的表达式转换成void类型。
- static_cast不能去掉类型的const,volitale属性。
1 | int n =6; |
4. dynamic_cast
有条件转换,动态类型转换,运行时类型安全检查。(转换失败返回NULL)
- 安全的基类和子类的转换
- 基类必须要有虚函数:保持多态性才能使用dynamic_cast转换
- 相同基类不同子类之间的交叉转换。但结果是NULL。