代码改变世界

运算转换符static_cast,const_cast,reinterpret_cast,dynamic_cast之间的区别

2008-11-26 20:44  Iron  阅读(286)  评论(0编辑  收藏  举报

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的类型一定是constTypeName;

例如:

   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运算符用来将基类的指针(或引用)转换为某个派生类的指针(或引用)

感谢:http://www.cnblogs.com/Winston/archive/2008/07/01/1213511.html