文章目录
- 1.static_cast关键字(编译时类型检查)
- 2.dynamic_cast关键字(运行时类型检查)
1.static_cast关键字(编译时类型检查)
用法:
- static_cast < type-id > ( expression ),该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性
它主要有如下几种用法:
- (1)用于基本数据类型之间的转换,如把int转换为char,把int转换成enum,但这种转换的安全性需要开发者自己保证(这可以理解为保证数据的精度,即程序员能不能保证自己想要的程序安全),如在把int转换为char时,如果char没有足够的比特位来存放int的值(int>127或int<-127时),那么static_cast所做的只是简单的截断,及简单地把int的低8位复制到char的8位中,并直接抛弃高位。
- (2)把空指针转换成目标类型的空指针
- (3)把任何类型的表达式类型转换成void类型
- (4)用于类层次结构中父类和子类之间指针和引用的转换。
对于static_cast,上行转换时安全的,而下行转换时不安全的
因为static_cast的转换时粗暴的,它仅根据类型转换语句中提供的信息(尖括号中的类型)来进行转换,这种转换方式对于上行转换,由于子类总是包含父类的所有数据成员和函数成员,因此从子类转换到父类的指针对象可以没有任何顾虑的访问其(指父类)的成员。
而对于下行转换为什么不安全,是因为static_cast只是在编译时进行类型检查,没有运行时的类型检查,具体原理在dynamic_cast中说明。
2.dynamic_cast关键字(运行时类型检查)
用法:
- dynamic_cast是四个强制类型转换操作符中最特殊的一个,它支持运行时识别指针或引用。
- 首先,dynamic_cast依赖于RTTI信息,其次,在转换时,dynamic_cast会检查转换的source对象是否真的可以转换成target类型,
这种检查不是语法上的,而是真实情况的检查。 - 若对指针进行dynamic_cast,失败返回nullptr,成功返回正常cast后的对象指针;
- 若对引用进行dynamic_cast,失败抛出一个异常,成功返回正常cast后的对象引用
dynamic_cast,主要用于类层次间的转换:
- 上行转换(子类转父类),转换安全,成功返回类对象指针, 此时和static_cast 作用一样。
- 下行转换(父类转子类), 父类中要有虚函数,否则编译器报错。转换分几种情况:
a. 父类指针指向子类对象,转换安全, dynamic_cast返回类对象指针。
b.父类指针指向父类对象,转换不安全,dynamic_cast 返回nullptr。
此时若使用static_cast, 返回非空指针,更不安全。 - eg:
- 测试:
- 参考:C++中static_cast和dynamic_cast强制类型转换,C++类型转换之dynamic_cast,C++强制类型转换操作符 dynamic_cast