C++中的类型转换操作符

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();
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值