美文网首页程序员
深入理解C++中的类型转换,小白也能成老鸟!

深入理解C++中的类型转换,小白也能成老鸟!

作者: Python编程导师 | 来源:发表于2019-03-10 20:29 被阅读7次

    在C/C++语言中,类型转换是一个绕不开的话题,所谓类型转换,其含义是通过改变一个变量的类型为别的类型从而改变该变量的表示方式。C++提供了多种类型转换的方式,下面将分别讲解。

    这是小编准备的C++学习资料,加小编学习群:825414254,加群即可获取哦!

    QQ截图20190309205647.jpg

    旧式类型转换

    旧式类型转换其实就是C风格转换,是从C语言中继承下来的,比如,为了转换一个类型为doubole的浮点数的指针到整型:


    image.png

    或者:


    image.png

    隐式类型转换

    C在以下四种情况下会进行隐式转换:

    1:算术运算式中,低类型能够转换为高类型。

    2:赋值表达式中,右边表达式的值自动隐式转换为左边变量的类型;

    3:函数调用中参数传递时,系统隐式地将实参转换为形参的类型后,赋给形参。

    4:函数有返回值时,系统将隐式地将返回表达式类型转换为返回值类型,赋值给调用函数。

    例如:


    image.png

    C++新式类型转换

    上面两种方式不能不分皂白的应用于类(class)和类的指针。ANSI-C++标准定义了四个新的转换符:’reinterpret_cast’, ‘static_cast’, ‘dynamic_cast’ 和 ‘const_cast’,目的在于控制类(class)之间的类型转换。

    dynamic_cast
    dynamic_cast只用于对象的指针和引用。当用于多态类型时, 其将基类类型对象的引用或指针转换为同一继承层次中其他类型的引用和指针。


    image.png

    当按如下创建一个对象b,Base * derived = new Derived(10); 。则默认derived->sayhi()无法通过编译,因为derived默认所指向的base类中不包含sayhi()。这时候可以利用dynamic_cast将其转换为Derived对象,使sayhi函数可用。

    与其他强制转换类型不同,dynamic_cast涉及运行时类型检查,如果绑定到引用或指针的对象不是目标类型的对象,则dynamic_cast失败,返回值为0或抛出一个bad_cast异常。

    因此上述代码中,Derived * staticDerived = static_cast (base);转换并不考虑类型检查,因此上述转换为错误的,将一个base对象强制转换成Derived,必然缺失了Derived具有的函数。使用dynamic_cast由于做类型检查,因此非法转换后的值为NULL,而static_cast不能检查转换类型。

    const_cast
    这个转换类型操纵传递对象的const属性,或者是设置或者是移除:


    image.png

    默认const对象是无法赋值给非const变量的,因此const_cast提供去掉const值的const属性,即可以赋值给非const变量。这里记录下const int number = 10; int tmp = number;是合法,因为tmp与number并非指向同一个对象,而引用和指针则不行。

    static_cast
    static_cast 允许执行任意的隐式转换和相反转换动作。(即使它是不允许隐式的)。

    意思是说它允许子类类型的指针转换为父类类型的指针(这是一个有效的隐式转换),同时,也能够执行相反动作:转换父类为它的子类,如下所示:


    image.png

    static_cast 除了操作类型指针,也能用于执行类型定义的显式的转换,以及基础类型之间的标准转换,如下所示:


    image.png
    reinterpret_cast
    reinterpret_cast 是一种高度危险的转换,这种转换仅仅是对二进制位的重新解释。

    这个操作符能够在非相关的类型之间转换。操作结果只是简单的从一个指针到别的指针的值的二进制拷贝。在类型之间指向的内容不做任何类型的检查和转换。如下所示


    image.png

    相关文章

      网友评论

        本文标题:深入理解C++中的类型转换,小白也能成老鸟!

        本文链接:https://www.haomeiwen.com/subject/bxmppqtx.html