在C语言中,进行类型转换只需要在变量前面加上变量类型,并且转换可以是双向的。例如int类型可以转换为double类型,double类型也可以转换为int类型。但是这种简单粗暴的方式在C++中是不合适的。第一,无法完成C++中的自定义数据类型类;第二,C语言可以在任意类型之间转换,比如可以将一个指向const型对象的指针转换为指向一个非const型对象的指针,这对类型检查非常严格的C++来说,显然是不合理的,所以C++提供了4种特有类型转换操作符。
1、static_cast类似于C语言中的类型转换,可以进行无条件类型转换。应用场景:
基本类型转换。
inti=1;doublej=static_castdouble(i);
父类和子类指针之间的转换。如果父类指针指向一个对象,此时将父类指针转换为子类指针是不安全的,子类指针转换为父类指针是安全的。
classBase(){};classDerived:publicBase{};Base*p1=newBase;Derived*p2=newDerived;Derived*p3=static_castDerived*(p1);//不安全Base*p4=static_castBase*(p2);//安全
将任何类型的表达式转换为void类型。注:static_cast不能去除类型的const或者volatile属性;不能进行无关类型转换(如非基类和子类)。
2、dynamic_castdynamic_cast只能用于对象指针之间的转换,转换结果亦可以是应用。在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的;在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。
classBase{virtualvoiddummy(){}};classDerived:publicBase{};Base*b1=newBase;Base*b2=newDerived;Derived*b3=dynamic_castDerived*(b1);//转换失败,返回NULLDerived*b4=dynamic_castDerived*(b2);//转换成功Derivedb5=dynamic_castDerived(b1);//转换失败(抛出异常)Derivedb6=dynamic_castDerived(b2);//转换成功
注:父子类指针之间转换时,该父类中必须包含一个虚函数。
3、const_cast用于取出const属性,去掉类型的const或者volatile属性,将const类型的指针变为非const类型的指针。
constint*fun(intx,inty){}; int*ptr=const_castint*(fun(2,3));4、reinterpret_cast
reinterpret_cast只是重新解释类型,没有二进制的转换。应用:
转换的类型必须是一个指针、引用、算术类型、函数指针或者成员指针。比特位级别上进行转换。它可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针(先把一个指针转换成一个整数,在把该整数转换成原类型的指针,还可以得到原先的指针值)。但不能将非32bit的实例转成指针。
一般用在函数指针类型之间进行转换。
不能保证可移植性。注:此类型转换不安全,需谨慎使用。
预览时标签不可点