您的位置:首页 > 其它

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

2008-07-01 14:56 253 查看
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正好相反,其只能负责不同类型的指针转换。

[b]reinterpret_cast运算符

[/b] 个人认为,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运算符用来将基类的指针(或引用)转换为某个派生类的指针(或引用)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐