C++中四种类型转换有:static_cast、const_cast、dynamic_cast和reinterpret_cast
一、static_cast
static_cast对任何具有明确定义的类型转换,只要不包含底层const,都可以使用static_cast。
旧式的强制类型转换
早期的C++版本中,显示的进行强制类型转换包含两种形式:
1) type(expr) ;//函数形式的强制类型装换
2) (type) expr;//C语言风格的强制类型转换
1.static_cast在编译时就进行类型转换,在C++中就是要替代旧式的强制类型转换,static_cast这种强制类型转换是安全的,如果编译器发现一个较大的算术类型(double)试图赋值给较小的类型(int),编译器不会发出警告信息。
例如: int a=10;
int b=3;
doubled=static_cast<double>(a);
//执行整数类型的除法
double slope=a/b; //结果为3
//执行浮点数的除法
double slope2=static_cast<double>(a)/b; //结果为3.33;
2.static_cast对编译器无法自动执行的类型转换也非常有用。例如,我们可以使用static_cast找回存在于void*指针中的值:
doubled=5.0;
void *p=&d; //任何非常量对象的地址都能存入void*中
double*dp=static_cast<double*>(p);//将void*转换回初始的指针类型
注:static_cast不能转换掉表达式的const
二、const_cast
const_cast只能改变运算对象的底层const,而不能改变运算对象的顶层const。
注:const_cast<>中的类型必须是指针或者引用类型
例如:const inta=10;
int a2=15;
const int *pci=&a;
const int *pci2=&a2;
int * pi=const_cast<int *>(pci)//通过pi改变a的值是失败的
int * pi2=const_cast<int*>(pci2)//通过pi2改变a2的值是成功的
说明:(1)pci指针指向一个常量对象时,通过使用const_cast类型转换去掉const,赋值为pi指针,不能通过pi指针改变原始常量对象的值。
(2)pci2指针指向一个非常量对象时,通过使用const_cast类型转换去掉const,赋值为pi2指针时,能够通过pi2指针改变原始非常量对象的值。
三、reinterpret_cast
reinterpret_cast通过为运算对象的位模式提供较低层次上的重新解释。通俗一点就是说,将内存中的数据以二进制存在的形式进行重新解释成其他类型。实质上并没有改变内存中的数据,而是以另外一种类型格式直接读取内存中的信息。
例如:
intn=20;
int*pi=&n;
double*pd3=reinterpret_cast<double*>(pi);
cout<<*pd3<<endl;//*pd3输出的值是(-9.25596e+061)一个乱指,而不是20.0,只是把20这个值按照double类型重新解释,读取重新解释的新值
注:reinterpret_cast只能以用于指针或引用类型,且使用reinterpret_cast是非常危险的,所以应谨慎使用reinterpret_cast。
四、dynamic_cast
详见:http://blog.csdn.net/xingkongfenqi/article/details/49148885