zoukankan      html  css  js  c++  java
  • 运算转换符static_cast,const_cast,reinterpret_cast,dynamic_cast之间的区别

    1 static_cast运算符
        可以这样说:在可以适用使用标准转换运算符的地方都可以适用static_cast运算符。
        其语法如下:
         valueOfTargetType=static_cast<TargetType>(valueofSourceType);
        例如:
        double d;int i=20;
        d=static_cast<doube>(i);

        还有:
        class A
    {
    protected:
        int m_x;
        char *m_username;
    public :
        A(int x)
        {
            m_x=x;
        }
        A(char *username)
        {
            m_username=new char[strlen(username)+1];
            strcpy(m_username,username);    
        }
       operater int ()
        {
            return m_x;
        }
        operator char *() const
        {
        return m_username;
        }
    }

    A a(2);
    int x=static_cast<int>(a);
    char *p=static_cast<const char *>(a);
    注意:这些static_cast运算符能够正常使用的原因只有一个:类A支持运算符int, const char *的overload.否则就和使用标准转换运算符一样是无用的。一般来说,static_cast很少用于指针转换。例如
        int *px;
        double y=2.2;
        px=static_cast<int *>(&y);//syntax error, can not convert double * to int *
    //可以这样理解,static_cast一般用于不同类型的数据的转换,而不能用于转换指针。而reinterpret_cast正好相反,其只能负责不同类型的指针转换。

    reinterpret_cast运算符
        个人认为,reinterpret_cast主要用于不同类型的指针的转换。   
         int *px;
        double y=2.2;
        px=reinterpret_cast<int *>(&y);//syntax ok,but it's meanningful??语法没有错误,但是没有任何意义
                                              //*px是一个任意值
        doule *py=reinterpret_cast<double *>(px);//ok, *py=2.2, so incredible!

    const_cast运算符
        const_cast运算符有能力消除常量数据或者常量对象的常量特性。
        其语法如下:
        nonConstValue=const_cast<TypeNam>(constValue)
        其作用是:去掉源值constValue的const特性,因而可将一个常量值constaValue赋给一个非常量值nonConstValue.要求nonConstValue的类型一定是TypeName, constValue的类型一定是const TypeName;
    例如:
       const int x=12;
        int *px=x; //syntax error, int pointer can not point to const int
    可以改为:
        const int x=12;
        int *px=const_cast<int *>(&x);
        *px=20;//ok;
    又例如:
    class Account
    {
    int balance;
    public:
        Account(int b)
        {
        balance=b;
        }

        void operater +=(int newbalance)
        {
        balance+=newbalance;
        }
    }

    const Account a(9000);
    Account *pa=&a;//syntax error!
    *pa+=1000;//syntax error!
    可以改为:
    const Account a(9000);
    Account *pa=const_cast<Account *>(&a);
    *pa+=1000;
    这样的话 const对象a 的balance就变为10000了!!

    总的来说,const_cast的主要作用之一是去掉const保护。因此少用为好。

    4 dynamic_cast运算符
        dynamic_cast运算符是C++支持运行时类型信息(Run_Time_Type information, RTTI)的一个组成元素。dynamic_cast运算符用来将基类的指针(或引用)转换为某个派生类的指针(或引用)
        

  • 相关阅读:
    再逛开心网
    WAPM
    win2003安装flash cs4
    [AS3][物体的运动]
    转sql产生百万记录
    KeyedList
    timer 焦点
    sql优化
    灰色
    参数
  • 原文地址:https://www.cnblogs.com/Winston/p/1213511.html
Copyright © 2011-2022 走看看