运算转换符static_cast,const_cast,reinterpret_cast,dynamic_cast之间的区别
2008-11-26 20:44 Iron 阅读(288) 评论(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