C++ 强制类型转换

  • static_cast,是一个强制类型转换操作符。编译器隐式执行的任何类型转换都可以由static_cast来完成,比如int与float、double与char、enum与int之间的转换等。
char a = 'a';
int b = static_cast(a);//正确,将char型数据转换成int型数据

double *c = new double;
void *d = static_cast(c);//正确,将double指针转换成void指针

int e = 10;
const int f = static_cast(e);//正确,将int型数据转换成const int型数据

const int g = 20;
int *h = static_cast(&g);//编译错误,static_cast不能转换掉g的const属性
  • const_cast,用于修改类型的const或volatile属性。
const int g = 20;
int *h = const_cast(&g);//去掉const常量const属性

const int g = 20;
int &h = const_cast(g);//去掉const引用const属性

const char *g = "hello";
char *h = const_cast(g);//去掉const指针const属性
  • reinterpret_cast,可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针(先把一个指针转换成一个整数,再把该整数转换成原类型的指针,还可以得到原先的指针值)。reinterpret_cast意图执行低级转型,实际动作(及结果)可能取决于编辑器,这也就表示它不可移植。错误的使用reinterpret_cast很容易导致程序的不安全,只有将转换后的类型值转换回到其原始类型,这样才是正确使用reinterpret_cast方式。
float f =  -12.4545;
unsigned char* p = reinterpret_cast(&f);
  • dynamic_cast,主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换(cross cast)
    dynamic_cast(e)
    dynamic_cast(e)
    dynamic_cast(e)
    type必须是一个类类型,在第一种形式中,type必须是一个有效的指针,在第二种形式中,type必须是一个左值,在第三种形式中,type必须是一个右值。在上面所有形式中,e的类型必须符合以下三个条件中的任何一个:e的类型是是目标类型type的公有派生类、e的类型是目标type的共有基类或者e的类型就是目标type的的类型。如果一条dynamic_cast语句的转换目标是指针类型并且失败了,则结果为0。如果转换目标是引用类型并且失败了,则dynamic_cast运算符将抛出一个std::bad_cast异常(该异常定义在typeinfo标准库头文件中)。e也可以是一个空指针,结果是所需类型的空指针。

你可能感兴趣的:(C++ 强制类型转换)