char a ='a';int b =static_cast<char>(a);//正确,将char型数据转换成int型数据double*c =newdouble;void*d =static_cast<void*>(c);//正确,将double指针转换成void指针int e =10;constint f =static_cast<constint>(e);//正确,将int型数据转换成const int型数据constint g =20;int*h =static_cast<int*>(&g);//编译错误,static_cast不能转换掉g的const属性
Derived *dp =static_cast<Derived *>(bp);//下行转换是不安全的
Base*bp =static_cast<Base*>(dp);//上行转换是安全的
constint g =20;int*h =const_cast<int*>(&g);//去掉const常量const属性constint g =20;int&h =const_cast<int&>(g);//去掉const引用const属性constchar*g ="hello";char*h =const_cast<char*>(g);//去掉const指针const属性
//MSDN中也提到了,实际中可将reinterpret_cast应用到哈希函数中,如下(64位系统中需将unsigned int修改为unsigned long)#include<iostream>// Returns a hash code based on an addressunsignedshortHash(void*p){unsignedint val =reinterpret_cast<unsignedint>( p );return(unsignedshort)( val ^(val >>16));}usingnamespace std;intmain(){int a[20];for(int i =0; i <20; i++)
cout <<Hash(a + i)<< endl;}
//另外,static_cast和reinterpret_cast的区别主要在于多重继承//前两个的输出值是相同的,最后一个则会在原基础上偏移4个字节,这是因为static_cast计算了父子类指针转换的偏移量,并将之转换到正确的地址(c里面有m_a,m_b,转换为B*指针后指到m_b处),而reinterpret_cast却不会做这一层转换。因此, 你需要谨慎使用 reinterpret_cast。classA{public:int m_a;};classB{public:int m_b;};classC:public A,public B {};
C c;printf("%p, %p, %p",&c,reinterpret_cast<B*>(&c),static_cast<B*>(&c));