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

来源:互联网 发布:centos 代理服务器 编辑:程序博客网 时间:2024/05/29 04:43

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