c++ 转型操作符

时间:2021-12-09 17:47:22

c++中有四个新的转型操作符:static_cast,dynamic_cast,const_cast,reinterpret_cast.

static_cast的功能和c中的强制转换差不多
基本数据类型中转化,在有相关联的类中相互转换
int a;
double b=static_cast a;

dynamic_cast 用来执行继承体系中的‘安全的向下转型’,转换成功返回指针或者引用,失败返回null(转型对象是指针)或者exception(转型对象是引用)
注意:基类中一定要含虚函数

向下类型:将基类指针或者引用转换成子类指针或者引用(因为基类指针或者引用可以指向,当这种情况发生时,转换成功,否者子类指针或者引用指向了基类对象(这是错误的,一般来说子类的表示范围更大,指针指向了超出对象的内存位置))
说明:static_cast 也可以如此,但是不会有类型检查
向上类型:将子类指针或引用转换成基类指针或引用

const_cast:将const类型指针或引用转换成非const类型的指针或引用或者反过来

const int a=10;
int *p=&a;//错误
int *p=const_cast<int *>(&a)//正确

reinterpret_cast:用来处理无关类型之间的转换,最常用的用途是指针类型中的转换(不同类型中的指针可以相互转换)。它的机理是对二进制数据进行重新的解释,不改变二进制原来的格式。static_cast会改变二进制的值。

借用别人的话
static_cast 和 reinterpret_cast 操作符修改了操作数类型。它们不是互逆的; static_cast 在编译时使用类型信息执行转换,在转换执行必要的检测(诸如指针越界计算, 类型检查). 其操作数相对是安全的。另一方面;reinterpret_cast 仅仅是重新解释了给出的对象的比特模型而没有进行二进制转换,例子如下:
int n=9;
double d=static_cast < double > (n);
上面的例子中, 我们将一个变量从 int 转换到 double。这些类型的二进制表达式是不同的。 要将整数 9 转换到 双精度整数 9,static_cast 需要正确地为双精度整数 d 补足比特位。其结果为 9.0。而reinterpret_cast 的行为却不同:

int n=9;
double d=reinterpret_cast<double & > (n);

这次, 结果有所不同. 在进行计算以后, d 包含无用值. 这是因为 reinterpret_cast 仅仅是复制 n 的比特位到 d, 没有进行必要的分析.