Introduction
C++中有四种类型转换操作符
- static_cast
- dynamic_cast
- const_cast
- reinterpret_cast
大多数编程规范都指出,要使用c++的类型转换操作符,如static_cast。而坚决抵制c语言中的强制类型转换,例如int y = (int) x
。
static_cast (编译时类型检查)
-
定义
static_cast<type-id> (expression)
该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性。
-
用法
- 用于基本数据类型之间的转换
如把int转换为char,把int转换为enum,但这种转换的安全性需要开发者自己保证(这可以理解为保证数据的精度,即程序员能不能保证自己想要的程序安全),如把int转换为char时,如果char没有足够的比特位来存放int的值(int>127或int<-127时),那么static_cast所做的只是简单的截断,及简单地把int的低8位复制到char的8位中,并直接抛弃高位。 - 把空指针转换成目标类型的空指针。
- 把任何类型的表达式类型转换成void类型。
- 用于类层次结构中父类和子类之间指针和引用的转换。
存在两种形式的转换:上行转换(子类到父类)和下行转换(父类到子类)。对于static_cast,上行转换是安全的,而下行转换是不安全的。为什么呢?因为static_cast的转换时粗暴的,它仅根据类型转换语句中提供的信息(尖括号中的类型)来进行转换,这种转换方式对于上行转换,由于子类总是包含父类的所有数据成员和函数成员,因此从子类转换到父类的指针对象可以没有任何顾虑的访问其(指父类)的成员。而对于下行转换为什么不安全,是因为static_cast只是在编译时进行类型坚持,没有运行时的类型检查,具体原理在dynamic_cast中说明。
- 用于基本数据类型之间的转换
dynamic_cast (运行时类型检查)
- 定义
dynamic_cast<type-id>(expression)
该运算符把expression转换成type-id类型的对象。Type-id必须是类的指针,类的引用,或者void。*
dynamic_cast可以在执行期间决定真正的类型。如果downcast是安全的(也就是说,也就是说基类指针或者引用确实指向一个派生类对象),这个运算符会传回适当转换过的指针。如果downcast是不安全的,这个运算符会传回空指针。
dynamic_cast主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换。
- 用法
将一个基类对象指针或引用cast到继承类指针,dynamic_cast会根据基类指针是否真正指向继承类对象来做响应处理。
对指针进行dynamic_cast,失败返回NULL,成功返回正常cast后的对象指针。
对引用进行dynamic_cast,失败抛出一个异常,成功返回正常cast后的对象引用。
在类层次间进行上行转换时,dynamic_cast和static_cast效果是一样的。
在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。
下面是自己的理解:
dynamic_cast<type-id>(expression)
作用就是把expression的静态类型转换为type-id,动态类型不变。
上行转换或者下行转换指的是转换之后指针静态类型和动态类型之间的关系。
上行转换指的是转换之后父类指针指向子类对象。
下行转换指的是转换之后子类指针指向父类对象。这种是不安全的。
这个表达式不改变实参。
哈哈哈,自己理解的应该是对的。