C++中有使用旧式转型的方式进行类型转换的方法,但能不用尽量不要用,它可能会破坏我们的整个项目,尽量使用以下四种类型转换操作符
const_cast
const_cast操作符允许添加或移除表达式中的const或volatile修饰符:
const Name *getMyName(){}//函数返回值为const Name *
Name *myname=const_cast<Name *>(getMyName());
//去掉了const修饰符
使用旧式转型的方法为
myname=(Name *)getMyName();//将const Name *返回值类型强制转换为Name *
还是那句话,不推荐这种写法,遇到这种情况,应优先使用const_cast,因为类型转换容易导致BUG的产生,而const_cast要比旧式转型的程度小,它只改变类型修饰符(在容易出错的地方改动越小越安全!),就好比以上例子,const_cast仅仅去掉了const,而旧式转型生硬的将const Name *类型转换为Name *
static_cast
static_cast操作符用于将一个继承层次结构中的基类的指针或引用,向下转型为一个派生类的指针或引用
class Shape{...};
class Circle:public Shape(...};
Shape *ptr=new Circle;//父类指针指向子类对象
Circle *ptr2=static_cast<Circle *>(ptr);//将父类指针向下转型为子类指针
指向Circle的Shape指针能成功的向下转化为指向Shape指针,指向其他子类的Shape指针不一定能成功转化
可以将两种转换合并为一个
const Shape *getNextShape(){...}
Circle *ptr3=static_cast<Circle *>(const_cast<Shape *>(getNextShape()));
//接连进行两次转换
reinterpret_cast
reinterpret_cast的转化能力更强大,它是C++与旧式转型最接近的类型转换运算符,他让程序员能够将一种对象类型转换为另一种,不管它们是否有关系,通常不优先使用它
char * ptr4=reinterpret_cast<char *>(0x00ff0000);//将int类型转化为char *
int *ptr5=reinterpret_cast<int *>(ptr4);//将char *转化为int *
dynamic_cast和运行阶段类型识别
dynamic_cast在运行阶段执行类型转换。可检查dynamic_cast操作的结果,以判断类型转换是否成功。
Sharp *ptr6=new Circle();
Circle *ptr7=dynamic_cast<Circle *>(ptr6);
if(ptr7)
ptr7->callCircleClassFunction();
还可把转换直接写到if语句内,这样ptr7的作用于被限制在if语句之内,当我们不在使用它时,ptr7将会离开作用于(ptr7指向的对象将会被销毁)
Sharp *ptr6=new Circle();
if(Circle *ptr7=dynamic_cast<Circle *>(ptr6))
ptr7->callCircleClassFunction();