再探C++Primer(7) 显式类型转换

###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无可厚非,其余的状况下使用说明程序存在设计上的缺陷。强制类型转换干扰了正常的类型检查,是一种很是危险的行为。

相关文章
相关标签/搜索