c++中的四种cast转换?

发布时间 2023-09-21 13:28:24作者: 叶之心

c++中的四种cast转换是:static_cast,const_cast,dynamic_cast,reinteroret_cast;

static_cast:

1.用于类层次结构中父类和子类之间指针或引用的转换。进行多态向上转换(子类指针或引用转换成父类)是安全的,多态向下转化是不安全的(把父类指针或引用转换成子类的指针或引用,没有动态类型检查)

2.用于基本的类型转换,如把int转换成char,int转换成enum。这种转换的安全性也要开发人员来保证。

3.把void指针转换成目标类型指针(不安全)

4.把任何类型的表达式转化成void类型。

const_cast:主要用来修改类型的const或volatile属性。除了去掉const或volatile修饰之外。type_id和expression得到的类型是一样的。但需要特别注意的是const_cast不是用于去除变量的常属性,而是去除指向常数对象的指针或引用的常属性,其去除常属性的对象必须为指针或引用。

dynamic_cast :主要用在继承体系中安全向下转型。它能安全地将指向基类地指针转型为指向子类的指针或引用,并获知转型动作是否成功。转型失败会返回NULL(转型对象为指针)或抛出异常bad_cast(转型对象为引用时)。

dynamic_cast会动用运行时信息(RTTI)来进行类型安全检查。因此dynamic_cast存在一定的效率损失。当使用dynamic_cast时,该类型必须有虚函数,这是因为dynamic_cast使用了存储在虚函数表中的信息来判断实际的类型。RTTI运行时类型识别用于判断类型。typeid表达式的形式typeid(e),typeid操作的结果是一个常量对象的引用,该对象的类型是type_info或type_info的派生。

reinteroret_cast:它可以把一个指针转换成一个整数,也可以将一个整数转换成一个指针。任何类型之间的转换。一般不建议使用