您现在的位置: 柚子树 > 柚子树栽培 > 正文 > 正文

C中的四种类型转换

  • 来源:本站原创
  • 时间:2020/9/13 20:55:10
白癜风治疗 http://m.39.net/pf/a_7082970.html

在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_cast

dynamic_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的实例转成指针。

一般用在函数指针类型之间进行转换。

不能保证可移植性。注:此类型转换不安全,需谨慎使用。

预览时标签不可点


本文编辑:佚名
转载请注明出地址  http://www.youzishua.com/yzszp/5375.html

  • 上一篇文章:
  • 下一篇文章: 没有了
  • 热点文章

    • 没有任何图片文章
    • 没有热点文章
    推荐文章

    • 没有任何图片文章
    • 没有推荐文章

    Copyright © 2012-2020 柚子树版权所有



    现在时间: