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的转化方便。^_^     

  • 相关阅读:
    父亲对子女的话
    开通博客
    在linux下安装MySQLdb及基本操作
    java 词汇表速查手册
    java数据源的几种配置
    DBCP的参数配置
    Linux crontab定时执行任务
    很好看的Button CSS.
    C# 创建活动目录.txt
    解密存储过程
  • 原文地址:https://www.cnblogs.com/zhangzhang/p/2438375.html
Copyright © 2011-2022 走看看