###static_cast#函数
任何有明肯定义的类型转行,只要不包含底层const,均可以用static_cast,用法以下:设计
double b = 10.1; int a = static_const<int>(b); //a=10
当须要把一个较大的算数类型赋值给较小的类型时很是有用,强制类型转行告诉编译器:我知道并不在意潜在的精度损失。因而执行了强制类型转行,编译器将再也不给出警告信息。指针
static_cast对于编译器没法自动执行的类型转换也颇有用,例如咱们能够用它找回存在于void*的指针:code
void *p = &c; int *d = static_cast<int*>(p);
但咱们必须确保c就是int类型的指针。对象
###const_cast#字符串
const_cast用于去除底层const。编译器
const char *a; char *b = const_cast<char*>(a); //正确,可是经过b改变a的值是未定义的
一旦咱们去掉const属性,编译器就再也不阻止咱们对a进行写操做了。若是a对象自己不是一个常量,那么强制类型装好得到写权限是合法的,若是a对象是一个常量,那么写操做将产生未定义的后果。string
只有const_cast能改变常量属性,const_cast不能用于改变表达式类型。编译
const char *p; char *q = static_cast<char*>(p); //错误,static_cast不能用于改变常量属性 static_cast<string>(p); //正确,将字符串字面值转换为string类型 const_cast<string>(p); //错误,const_cast只能改变常量属性
###reinterpret_cast#ast
reinterpret_cast对对象的位模式提供较低层面的从新解释,例如:
int *a; char *b = reinterpret_cast<char*>(a);
咱们必须记得b所指对象是一个int而不是字符,若是把b当成普通的字符指针将可能在运行时发生错误
string c(b);
可能致使异常行为。
咱们应该尽量减小使用强制类型转换,在有重载函数的上下文使用const_cast无可厚非,其余的状况下使用说明程序存在设计上的缺陷。强制类型转换干扰了正常的类型检查,是一种很是危险的行为。