c++中的显式强制转换总结

有时候我们需要将一个对象显式的强制转换为另一种类型。比如

int i = 10,j = 3;
double reuslt = (double) i / j;

这种处理就是强制类型转换,下面讲解一下使用命名的强制类型转化,命名的强制类型转化的格式为:
cast-name<type>(expression);

1 static_cast

static_cast的用途很广泛,所有具有明确定义的类型转换均可使用它,只要不包含底层const(见cpp primer p57)。如
double result = static_cast<double>(i) / j;
当我们把一个较大的算术类型赋予较小类型时,static_cast可以告诉编译器这个操作不在意精度损失。
static_cast亦可完成编译器无法自动执行的类型转换,比如我们可以用static_cast找回存在于void*指针中的值。

void* p = &d;
double *dp = static_cast<double*>(p);

2 reinterpret_cast

reinterpret_cast通常为运算符对象的位模式提供低层次上的重新解释,如

int *ip;
char *pc = reinterpret_cast<char*>ip;

这时pc所指的对象是一个int。使用reinterpret_cast是比较危险的操作,比如在这个例子中,若我们再次使用pc,编译器无法得知它存放了一个int指针。这种转换在我们需要把类型映射回原有类型时用到它。

3 const_cast

const_cast能改变运算对象的底层const(见cpp primer p57):

int i = 100;
const int *pc = &i;
int *p = const_cast<char*>(pc);//允许,但是如果通过p写值会产生未定义行为

对于常量对象转换成非常量对象的行为,我们称之为去掉const性质。需要注意的是在去掉常量性质之后,如果对象是个常量,通过指针进行写值会发生未定义行为。如上述代码所示,如果使用p对i写值的话,将产生未定义行为。

猜你喜欢

转载自blog.csdn.net/MoonWisher_liang/article/details/107450289