zoukankan      html  css  js  c++  java
  • c++中的强制转换

    一、C语言的强制转换
    1.1 隐性转换
      不同数据类型之间赋值和运算,函数调用传递参数等等,由编译器完成
            int        nTmp = 10;
            short    sTmp = nTmp; //这个时候就需要注意转换时数据是否溢出(大字节转小字节)
    1.2 显性转换
      在变量的前面加上(Type)进行显性转换,如:
            class Test;
            Test *test;
            T* obj = (T*)test;//将对象强制转换成T
    二、C++语言的转换
      C++语言的强制有由四个标准的转换符组成;static_cast、const_cast、dynamic_cast、reinterpret_cast,除前面四个转
    换符,C++也继承了C语言的强制转换,但这种转换并不是安全和严格的。


    2.1 static_cast
      用法:static_cast < typeid > ( exdivssion )
    该运算符把exdivssion转换为typeid类型,但没有运行时类型检查来保证转换的安全性。它主要有如下几种用法:
    ①用于类层次结构中基类和子类之间指针或引用的转换。
      进行上行转换(把子类的指针或引用转换成基类表示)是安全的;
      进行下行转换(把基类指针或引用转换成子类表示)时,由于没有动态类型检查,所以是不安全的。
    ②用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。这种转换的安全性也要开发人员来保证。
    ③把空指针转换成目标类型的空指针。
    ④把任何类型的表达式转换成void类型。
    注意:static_cast不能转换掉exdivssion的const、volitale、或者__unaligned属性。


    2.2dynamic_cast
      用法:dynamic_cast < typeid > ( exdivssion )
    该运算符把exdivssion转换成typeid类型的对象。Type-id必须是类的指针、类的引用或者void *;
    ①如果type-id是类指针类型,那么exdivssion也必须是一个指针,如果type-id是一个引用,那么exdivssion也
    必须是一个引用。
    ②dynamic_cast主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换。
        在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的;
    ③在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全
    class CBase
    {
    public:
        virtual void PrintfOut(){};
    };

    class Test : public CBase
    {
    private:
        int m_nCount;   
    };

    void func(CBase *pb)
    {
        Test *pd1 = static_cast(pb);
        Test *pd2 = dynamic_cast(pb);
    }
    注意:通常情况下dynamic_cast,在基类转为了类才有意义,但是如果没有虚函数,基类转换为子类时会出错,
    这是虚函数对dynamic_cast,说句题外话虚函数表,在C++对象模型中,对象实例最前面的就是虚函数表指针。


    2.3 reindivter_cast
      用法:reindivter_cast<typeid>(exdivssion)
    type-id必须是一个指针、引用、算术类型、函数指针或者成员指针。
    它可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针(先把一个指针转换成一个整数,
    在把该整数转换成原类型的指针,还可以得到原先的指针值)。

    2.4 const_cast
      用法:const_cast<typeid>(exdivssion)
    该运算符用来修改类型的const或volatile属性。除了const 或volatile修饰之外, typeid和exdivssion的类型是一样的。
    常量指针被转化成非常量指针,并且仍然指向原来的对象;
    常量引用被转换成非常量引用,并且仍然指向原来的对象;常量对象被转换成非常量对象。
    const int tmpValue = 10;
    const int* nConst = &tmpValue;
    int* modify = c

  • 相关阅读:
    intellij idea for mac 2018 破解版
    Mac下Supervisor进程监控管理工具的安装与配置
    Mysql千万级大表优化策略
    php7实现基于openssl的加密解密方法
    openresty--centos7下开发环境安装
    webstorm下搭建编译less环境 以及设置压缩css
    七牛图片上传
    聊一聊PHP的依赖注入(DI) 和 控制反转(IoC)
    joomla! 3.X 开发系列教程
    JSON反序列化接口的问题
  • 原文地址:https://www.cnblogs.com/wenrenhua08/p/3995277.html
Copyright © 2011-2022 走看看