zoukankan      html  css  js  c++  java
  • C++的显式转换

    我们应该小心的使用转换,这无疑就是告诉编译器”忘记类型检查,把它看作是其它的类型”,这就是在C++的类型系统中引入了一个漏洞,并阻止编译器报告在类型检查上出错了,所有的出错都必须由程序员自己来解决.并且这些转换都很难查找出来(难以定位),他们通常就是一个括号,因此在标准的C++中引入了一个显式的转换语法,使用我们很容易的对其定位:

    static_cast 用于”良性”和”适度良性”的转换,如自动转换

    const_cast 对”const”和”volatile”进行转换

    reinterpret_cast 最危险的

    dynamic_cast 用于类型安全的向下转换

    静态转换(static_cast)

    static_cast用于明确定义的变换,包括编译器允许我们做而不用强制的转换,和不太安全但清楚定义的变换(如窄化),void*转换.我们看代码:

    void castTest()
    {
        int i=0x7fff;
        long l;
        float f;
        //类型的无损转换,也就是我们常说的自动向下
        l=i;
        f=i;
        //下面的同样有效,标准C++显式转换语法
        l=static_cast<long>(i);
        f=static_cast<float>(i);

        //“窄化”,有信息丢失
        i=l;
        i=f;
        //...
        i=static_cast<int>(l);
        i=static_cast<int>(f);
        char c=static_cast<char>(i);

        //void指针强转
        void* vp=&i;
        float* fp=(float*)vp;
        fp=static_cast<float*>(vp);
    }

    常量转换(const_cast)

    这个唯一的功能就是把const转换到non-const或者volatile到non-volatile

    //const_cast.cpp

    int main(){

    int a=32;
    const int* cp=&a;
    int* p=(int*)cp;
    p=const_cast<int*>(cp);

    }

    重解释转换(reinterpret_cast)

    这是最不安全的一种转换了,就像它的名字一样,是对类型的重解释

    #include "stdafx.h"
    #include "Cast2.h"
    #include <cstdlib>
    using namespace std;

    extern const int sz;
    struct X
    {
        int a[sz];
    public:
        //X(){memset(a,0,sz*sizeof(int));}
    };

    void print(X* x)
    {
        for(int i=0;i<sz;i++)
        {
            cout<<i<<" : "<<x->a[i]<<endl;
        }
    }

    void castTest2()
    {
        X x;
        print(&x);
        int* xp=reinterpret_cast<int*>(&x);
        for(int* i=xp;i<xp+sz;i++)
            *i=0;
        print(reinterpret_cast<X*>(xp));
    }

  • 相关阅读:
    图像有用区域--------深搜和广搜的第一次二选一
    24Pointgame-----24点游戏
    CAP定理和BASE理论
    并查集
    七桥问题和一笔画
    组合数问题--------一种新的 搜索 思路
    最少换乘 之简化版
    吝啬的国度 ---用vector 来构图
    WGZX:javaScript 学习心得--1
    eclipse Maven -->web project
  • 原文地址:https://www.cnblogs.com/asiancount/p/2384221.html
Copyright © 2011-2022 走看看