zoukankan      html  css  js  c++  java
  • 关于c++中的类型转换符

    const_cast(链接)

    用来去掉const或volatile属性

      volatile:

    • 用于并行设备的硬件寄存器(状态寄存器),
    • 中断服务子程序中会访问到的非自动变量,
    • 多线程中被几个任务共享的变量

    一般用来将常量指针变为非常亮指针, 常量引用变为非常量引用, 常量对象变为非常量对象

    static_cast(链接

    强制类型转换:(不含类型转换的安全检查)

    子类指针转换为父类指针,父类指针可以转换为子类指针(但是不安全)

    用于:

    • 类中基类和派生类指针和引用的转换
    • 基本类型转换(相当于c语言中的类型转换)
    • 空指针转换为目标类型的空指针
    • 任何类型转换为void类型
    • 不可以去掉const volatile expression类型

    reinterpret_cast

    仅仅重新解释类型,但没有进行二进制的转换:
    1. 转换的类型必须是一个指针、引用、算术类型、函数指针或者成员指针。
    2. 在比特位级别上进行转换。它可以把一个指针转换成一个整数,也可以把
    一个整数转换成一个指针(先把一个指针转换成一个整数,再把该整数转换成
    原类型的指针,还可以得到原先的指针值)。但不能将非32bit的实例转成指
    针。
    3. 最普通的用途就是在函数指针类型之间进行转换。
    4. 很难保证移植性。
    例子:

    • int doSomething(){return 0;};
    • typedef void(*FuncPtr)();
    • //FuncPtr is 一个指向函数的指针,该函数没有参数,返回值类型为 void
    • FuncPtr funcPtrArray[10];
    • //10个FuncPtrs指针的数组 让我们假设你希望(因为某些莫名其妙的原因)把一个指向下面函数
    • 的指针存入funcPtrArray数组:
    • funcPtrArray[0] = &doSomething;
    • // 编译错误!类型不匹配,reinterpret_cast可以让编译器以你的方法去看待它们:funcPtrArray
    • funcPtrArray[0] = reinterpret_cast<FuncPtr>(&doSomething);
    • //不同函数指针类型之间进行转换

    用于以二进制形式重新解释类型,但是没有进行二进制的类型转换

    dynamic_cast

    有条件转换,动态类型转换,运行时类型安全检查(转换失败返回
    NULL):
    1. 安全的父类和子类之间转换。
    2. 必须要有虚函数。
    3. 相同父类不同子类之间的交叉转换。但结果是NULL。
    例子:

    class BaseClass
    {
        public:
        int m_iNum;
        virtual void foo(){};
    };

    基类必须有虚函数。保持多态特性才能使用dynamic_cast

    总结
    去const属性用const_cast。
    基本类型转换用static_cast。
    多态类之间的类型转换用dynamic_cast。
    不同类型的指针类型转换用reinterpret_cast

  • 相关阅读:
    SEO优化---学会建立高转化率的网站关键词库
    从一个程序员的角度看——微信小应用
    当AngularJS POST方法碰上PHP
    angularJS(6)
    彻底解决显示Opencv中Mat图像到Mfc窗口问题
    数据结构与算法基础总结
    java类别问题
    java基础知识
    逻辑地址、线性地址、物理地址和虚拟地址的区别
    TCP协议中的三次握手和四次挥手(图解)
  • 原文地址:https://www.cnblogs.com/fanhua666/p/11555757.html
Copyright © 2011-2022 走看看