显示转换

1、静态转换   static_cast

  static_cast 全部用于明确定义的变换,包括编译器允许我们所做的不用强制转换的“安全”变换和不太安全但清楚定义的变换。

  static_cast包含的转换类型包括典型的非强制变换窄化(有信息丢失)变换,使用void* 的强制变换、隐式类型变换和类层次的静态定位

    int i = 0x7fff;//32767
    long l;
    float f;
    //Typical castless conversions:
    l = i;
    f = i;
    cout<<l<<endl;
    cout<<f<<endl;
    //Static_cast conversions:
    l = static_cast<long>(i);
    f = static_cast<float>(i);
    cout<<l<<endl;
    cout<<f<<endl;
    //Narrowing conversions:
    i = l;
    i = f;
    cout<<i<<endl;
    cout<<i<<endl;
    i = static_cast<int>(l);
    i = static_cast<int>(f);
    char c = static_cast<char>(i);
    cout<<i<<endl;
    cout<<i<<endl;
    cout<<i<<endl;

  2、常量转换 const_cast

    如果从const转换为非const 或 从volatile转换为非volatile, 可以使用const_cast 。这是const_cast 唯一允许的转换;如果进行别的转换就可能使用单独的表达式或者可能会得到一个编译错误。

    

const int a = 0;
    int* j = (int*)&a;// Deprecated form
    j = const_cast<int*>(&a);// Preferred
    //Can't do simultaneous additional casting:
     long* l = const_cast<long*>(&a);  //Error//!“const_cast”: 无法从“const int *”转换为“long *”

    volatile int k = 0;
    int* u = const_cast<int*>(&k);

 

  3、重解释转换 reinterpret_cast

    这是最不安全的一种转换机制,最有可能出问题。reinterpret_cast把队形假想为模式(为了某种隐秘的目的),彷佛它是一个完全不同类型的对象。

posted @ 2013-03-10 22:04  wiessharling  阅读(237)  评论(0编辑  收藏  举报