强制类型转换的格式为:
cast-name<type>(expression);
static_cast
任何具有明确定义的类型转换,只要不包含底层const,都可以使用static_cast,例如:
int i,j;
double k=static_cast<double>(j)/i;
当需要把一个较大的算数类型转换成一个较小的算数类型时很有用,这意味着我们不在乎精度的损失
我们也可以用它来转换指针,但是要保证指针的值不变,不然会产生未定义的错误
例如:
void* p=&d;
double *dp=static_cast<double*>(p);
注意:static_cast不会改变原变量的类型
const_cast 专门用于改变对象的底层const
例如:
const int *p;
int* q=const_cast<int *>(p); //由于对象本身是常量 所以不能用q向p写值
//注意const_cast只能用于改变const属性 不能用于改变类型
sring* q=const_cast<string*>(p) //报错
const_cast也不能改变变量的原始类型
reinterpret_cast 通常为运算对象的位模式提供较低层次上的重新解释,例如
int *p;
char *q=reinterpret_cast<char*>(p);
//q虽然显式的是char指针 单实际上是int指针
strng str(q); //会导致异常的运行行为
怎样检查变量类型
#include<typeinfo>
int a;
cout<<"a:"<<typeid(a).name()<<endl;
强制类型转换干扰了正常的类型检查,我们在写程序时,应该尽量避免使用强制类型转换