zoukankan      html  css  js  c++  java
  • C++四种强制类型转换

    C++中的四种强制类型转换除了具有C语言强制类型转换的功能外,还可提供更好的控制强制转换的过程;能更清晰地表明程序员的意图,程序员只有看到这样的代码,立即就能知道一个强制类型转换的目的。 

    C风格的强制类型转换(Type Cast)很简单,不管什么类型的转换统统是: TYPE b = (TYPE)a,而C++风格的类型转换提供了四种类型转换操作符来对应不同的场景,使用格式是: TYPE b = 强制转换类型符<TYPE>(a)。 

     Const_cast常用于去掉类型的const或volalitle属性,只能用于指针和引用的,无法对变量进行使用,以便对const变量进行赋值等操作。 Dynamic_cast能够安全地用于类之间的类型转换,如父类转换为子类,或者子类转换为父类。很多场合能使用static_cast的地方可以使用dynamic_cast来替换。 Static_cast更多地用于基本数据类型之间的转换.reinterpret_cast主要用于转换不相容的数据类型,如线程函数传递的this指针数据换为原来的数据类型。不建议使用

     

    一、 reinterpret_cast 

    reinterpret_cast主要用于转换不相容的数据类型,特别是能够把任何数据类型转换为指针类型和引用类型,以及相反的过程,也可以用于指针之间的转换。 错误使用reinterpret_cast操作符很容易产生不安全的行为,因此,尽量使用其他三种转换操作符。 

    二、 static_cast 

    类似于C风格的强制类型转换,是无条件的转换和静态的转换,用于:

     1. 基类和子类之间的转换:子类指针转换成父类是指针是安全的;但父类指针转换成子类指针是不安全的。 

    2. 基本数据类型转换,如enum,struct,int,char,float等。

     3. 空指针转换成目标类型的指针。 

    4. 任何类型的表达式转换成void类型。 

    5. Static_cast不能去掉类型的const,volitale属性。 

    int n = 6; 

    double d = static_cast<double>(n);//基本类型转换 int *pn = &n; 

    //double *d = static_cast<double>(&n);//无关类型指针转换,编译错误 void* p = static_cast<void*>(pn);//任意类型转换成void类型 

    6. 如果涉及到类的话,static_cast只能在有相互联系的类型中进行相互转换,不能进

    行无关类类型指针之间的转换(如非基类和子类)。 

          class A      {};  

         class B:public A   {};  

         class C      {};  

         A* a = new A;    

        B* b;     

     C* c;  

         b = static_cast<B*>(a);//父类转子类,编译不会报错,B类继承A类      //c = static_cast<B*>(a);//编译报错,C类与A类没有任何关系  

    三、 dynamic_cast 

    static_cast转换没有dynamic_cast转换安全。因为static_cast不进行运行时检查,而dynamic_cast会进行运行时检查。当对于一个模糊指针使用static_cast时不会报错,使用dynamic_cast时会报错。 

    虽然dynamic_cast是安全的,dynamic_cast仅仅对指针和引用有效,并且允许时检查也会影响效率。 

    用法:dynamic_cast< type-id > ( expression )。 

    该运算符把expression转换成type-id类型的对象。Type-id必须是类的指针、类的引用或者void*;如果type-id是类指针类型,那么expression也必须是一个指针,如果type-id是一个引用,那么expression也必须是一个引用。 

    classB { public: intm_iNum;

    virtualvoidfoo(); };

    classD: publicB { public:

    char* m_szName[100]; };

    voidfunc(B* pb) {

    D* pd1 = static_cast<D*>(pb); D* pd2 = dynamic_cast<D*>(pb); }

    在上面的代码段中,如果pb指向一个D类型的对象,pd1和pd2是一样的,并且对这两个指针执行D类型的任何操作都是安全的;但是,如果pb指向的是一个B类型的对象,那么pd1将是一个指向该对象的指针,对它进行D类型的操作将是不安全的(如访问m_szName),而pd2将是一个空指针。 

    四、 const_cast 

    1、去掉类型的const或volalitle属性,如: 

    structSA {  inti; SA(void)         { i = 0;         }     };  constSAra; 

    /*    ra.i = 10;//直接修改const类型,编译错误“:error C3892: “ra”: 不能给常量赋值”*/  

    SA&rb = const_cast<SA&>(ra); rb.i = 10; 

    2、把一个本来不是const类型的数据转换成const类型。 

    voidreadonly(constchar* s); char* p1 = newchar[12];  

    readonly(p1);

    //隐式转换为const char*类型 //

    readonly(const_cast<const char*>(p1));//显式 

    3、const_cast操作不能在不同的种类间转换。

  • 相关阅读:
    重新想象 Windows 8 Store Apps (15) 控件 UI: 字体继承, Style, ControlTemplate, SystemResource, VisualState, VisualStateManager
    重新想象 Windows 8 Store Apps (12) 控件之 GridView 特性: 拖动项, 项尺寸可变, 分组显示
    返璞归真 asp.net mvc (10) asp.net mvc 4.0 新特性之 Web API
    与众不同 windows phone (29) Communication(通信)之与 OData 服务通信
    与众不同 windows phone (33) Communication(通信)之源特定组播 SSM(Source Specific Multicast)
    与众不同 windows phone (27) Feature(特性)之搜索的可扩展性, 程序的生命周期和页面的生命周期, 页面导航, 系统状态栏
    与众不同 windows phone (30) Communication(通信)之基于 Socket TCP 开发一个多人聊天室
    返璞归真 asp.net mvc (12) asp.net mvc 4.0 新特性之移动特性
    重新想象 Windows 8 Store Apps (2) 控件之按钮控件: Button, HyperlinkButton, RepeatButton, ToggleButton, RadioButton, CheckBox, ToggleSwitch
    重新想象 Windows 8 Store Apps (10) 控件之 ScrollViewer 特性: Chaining, Rail, Inertia, Snap, Zoom
  • 原文地址:https://www.cnblogs.com/davy2013/p/3147420.html
Copyright © 2011-2022 走看看