zoukankan      html  css  js  c++  java
  • C++的四种转换(const_cast、static_cast、dynamic_cast、reinterpreter_cast)

    static_cast

    相当于C语言中的强制转换:(类型)表达式或类型(表达式),用于各种隐式转换

    非const转const、void*转指针、int和char相互转换

    用于基类和子类之间的指针和引用转换,非指针直接报错

    向上转化是安全的,如果向下转能(指针或引用)成功但是不安全,结果未知;

    dynamic_cast

    用于动态类型转换。只能用于含有虚函数的类,必须用在多态体系种,用于类层次间的向上和向下转化。只能转指针或引用。向下转化时,如果是非法的对于指针返回NULL,对于引用抛异常。

    在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。

    如果没有virtual方法进行下行转换(指针或引用)会直接报错

    const_cast

    常量指针被转化成非常量的指针,并且仍然指向原来的对象;

    常量引用被转换成非常量的引用,并且仍然指向原来的对象;

    const_cast一般用于修改底指针。如const char *p形式。

    const int a=10;
    int *p=const_cast<int*>(&a);	//p和a指向同一块内存地址
    *p = 100;	//修改*p,但a=10,*p=100
    

    reinterpret_cast

    (重解释转换)几乎什么都可以转,比如将int转指针,可能会出问题,尽量少用;随意的转换编译都会通过,但是不安全的转换运行时会异常

    错误的使用reinterpret_cast很容易导致程序的不安全,只有将转换后的类型值转换回到其原始类型,这样才是正确使用reinterpret_cast方式。

    reinterpret_cast不能转换掉表达式的const

    可以用在将void*转换为int类型

    unsigned short Hash( void *p ) {
       unsigned int val = reinterpret_cast<unsigned int>( p );
       return ( unsigned short )( val ^ (val >> 16));
    }
    
  • 相关阅读:
    vue通过webpack打包后怎么运行
    vue中请求本地的json数据
    electron打包成桌面应用程序的详细介绍
    Web应用架构-Services
    Web应用架构-Full-text Search Service
    Web应用架构-Job Queue & Servers
    Web应用架构-Caching Service
    Web应用架构-Database
    设计模式:设计模式概述&JDK中的应用
    常见面试问题总结
  • 原文地址:https://www.cnblogs.com/WindSun/p/11434419.html
Copyright © 2011-2022 走看看