zoukankan      html  css  js  c++  java
  • [zz]c++强制转化

    个人总结:

      在python中就不用考虑类型转换这些,不过使用了C++ 没有办法~

      static_cast顾名思义就是没有做类型检查

     
      用法:static_cast < type-id > ( expression )
     
      该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性。它主要有如下几种用法:
     
      ①用于类层次结构中基类(父类)和派生类(子类)之间指针或引用的转换。
     
      进行上行转换(把派生类的指针或引用转换成基类表示)是安全的;
     
      进行下行转换(把基类指针或引用转换成派生类表示)时,由于没有动态类型检查,所以是不安全的。
     
      ②用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。这种转换的安全性也要开发人员来保证。
     
      ③把空指针转换成目标类型的空指针。
     
      ④把任何类型的表达式转换成void类型。
     
      注意:static_cast不能转换掉expression的const、volatile、或者__unaligned属性。
     
      C++中static_cast和reinterpret_cast的区别
     
      C++primer第五章里写了编译器隐式执行任何类型转换都可由static_cast显示完成;reinterpret_cast通常为操作数的位模式提供较低层的重新解释
     
      1、C++中的static_cast执行非多态的转换,用于代替C中通常的转换操作。因此,被做为隐式类型转换使用。比如:
     
      int i;
     
      float f = 166.7f;
     
      i = static_cast<int>(f);
     
      此时结果,i的值为166。
     
      2、C++中的reinterpret_cast主要是将数据从一种类型的转换为另一种类型。所谓“通常为操作数的位模式提供较低层的重新解释”也就是说将数据以二进制存在形式的重新解释。比如:
     
      int i;
     
      char *p = "This is a example.";
     
      i = reinterpret_cast<int>(p);
     
      此时结果,i与p的值是完全相同的。reinterpret_cast的作用是说将指针p的值以二进制(位模式)的方式被解释为整型,并赋给i,//i 也是指针,整型指针;一个明显的现象是在转换前后没有数位损失。

    好了,以下是转载的正文:

    -----------------------------------------------------------------我是无情的分割线---------------------------------------------------------------------------------------

    强制转化四种类型可能很多人都常常忽略就象我一样,但是有时还是比较有用的。不了解的建议看看,一些机制我也不是十分了解,只是将一些用法写出来让大家看看。
                                                                2004-11-27 9:00

    强制转化无论从语法还是语意上看,都是c++中最难看的特征之一。但是基于c风格的转化的语义的不明确性及其一些潜在问题。强制类型转化最终还是被c++接受了。
    1.static_cast运算符号
    static_cast<T>(e),stroustrup让我们可以把它看成隐含转换的显示的逆运算。这个是有一定道理的,基于隐式转化的对象类型我们可以使用static_cast转化运算符号。它是静态的检测,无法运行时检测类型,在继承中尤为突出。
    使用范围
    <1>用于所有系统类型之间转化,不能用于系统类型指针类型转化
      double t_d = 0;
    int t_i= static_cast<int>(t_d); //是合法的转化
    而企图将double*->int*是不允许的
    <2>用于继承类之间的转化(含指针),不能用于其他没有隐式转化的对象类型之间的转化
    继承举例:
    class x
    {
    };
    class y: public x
    {
    };
    使用:x t_o_x;
    y t_o_y = static_cast<y>(t_o_x); //x* y*转化也可以进行因为x,y继承关
    //系,类型可以自动隐式转化使用
       隐式转化举例:
    class x
    {
    };
    class y
    {

    public:
        y( x i_x ) {}
    };
        x t_o_x;
         y t_o_y = static_cast<y>(t_o_x); //大家看到y构造函数可以对于x类型隐式转化
    //所以可以将x->y,如果企图将y->x会报错

    这里所说的 隐式转化 就是自己定义了 用x可以构造(转化)y的方式,系统可以自动调用。


    2.reinterpret_cast 运算
    主 要用于对于类型指针类型的强制转化,some_type* -> special_type*这样转化,类型信息可以是不完全的。它允许将任意指针转化到其他类型指针,也允许任意整数类型到任意指针类型转化(BT)。这 样导致的结果是极其不安全的,不能安全的应用于其他目的,除非转化到原来类型。
    <1> 使用所有整形可以转化为任意类型的指针(指针是4字节的long的东东,那么机器就认为同类型就是可以转化)
    int c;
    x* p = reinterpret_cast<x*>(c); //x是自定义的任意类型,当然包括系统类型
    <2> 可以对于任意类型指针之间转化
    y* c;
    x* p = reinterpret_cast<x*>(c);//x,y代表所有自定义或系统类型
    大家可以看到reinterpret_cast的转化是极度的不负责任的,他只管转化不检测是否可以转化。
    <3> const_cast运算符号
    这个很简单从名字大家可以看出来,仅仅为了去掉或着加上const修饰符号。但是对于本身定义时为const的类型,即使你去掉const性,在你操作这片内容时候也要小心,只能r不能w操作,否则还是会出错。
    const char* p = "123";
    char* c = const_cast<char*>(p);
    c[0] = 1;  //表面上通过编译去掉了const性,但是操作其地址时系统依然不允许这
    //么做。这是一个漏洞吧
    <4> dynamic_cast运算符号
    Scott Mayers将其描述为用来执行继承体系中:安全的向下转型或者跨系转型动作。也就是说你可以,用dynamic_cast将 指向base class的指针或引用转型为 指向子类的对象的指针或引用。
    class B {};  //polymorphic类型含virtual才能dynamic_cast
    class D: public B {}
    void f( B* pb )
    {
        D* pd1 = dynamic_cast<D*>(pb);//如果pb为d类型正确返回,如果不是返回0
        D* pd2 = static_cast<D*>(pb); //不管怎么样都返回指针有可能指向不合适的对
    //象,因为static仅仅静态检测,不能得到运
    //行时对象的信息是否真正为D类型
    }

    反正大家在使用知道怎么用就ok了,c++强制转化在模板中还是非常有用的,其他时候本人也喜欢用c的转化方便。^_^     

  • 相关阅读:
    网页加速的14条优化法则 网站开发与优化
    .NET在后置代码中输入JS提示语句(背景不会变白)
    C语言变量声明内存分配
    SQL Server Hosting Toolkit
    An established connection was aborted by the software in your host machine
    C语言程序设计 2009春季考试时间和地点
    C语言程序设计 函数递归调用示例
    让.Net 程序脱离.net framework框架运行
    C语言程序设计 答疑安排(2009春季 110周) 有变动
    软件测试技术,软件项目管理 实验时间安排 2009春季
  • 原文地址:https://www.cnblogs.com/zhangzhang/p/2438375.html
Copyright © 2011-2022 走看看