C++必知必会之(9)新式转型操作符

一、C++引入了另一种转型,即采用函数形式的转型语法来表达同样的意思:

typedef char *PChar;

hopeItWorks = PChar( 0x00ff0000);


1、const_cast操作符允许添加或移除表达式中类型的const或volatile修饰符:

const Person  *getEmployee( )  {.....}

//.....

Person *anEmployee = const_cast<Person *>(getEmployee());

任何形式的转型都存在危险。只有当不得不使用时才键入它们。


2、static_cast操作符用于相对而言可跨平台移植的转型。最常见的情况是它用于将一个继承层次结构中的基类的指针或引用,向下转型为一个派生类的指针或引用。

Shape *sp = new Circle;

Circle *cp = static_cast<Circle  *>(sp);  //向下转型

注意,static_cast无法像const_cast那样改变类型修饰符。这意味着有时需要使用两个新式转型操作符所构成的转型序列,来获得单个旧式转型所能达到的效果:

const Shape  *getNextShape( )   {....}

//.....

Circle *cp = static_cast<Circle  *>(const_cast<Shape *>(getNextShape()));


3、reinterpret_cast通常的行为可以从它的名字中看出来。它从位的角度看待一个对象,从而允许将一个东西看作另一个完全不同的东西:

hopeItWorks = reinterpret_cast<char * >(0x00ff0000);    //把int假装成指针

int *hopeless = reinterpret_cast<int * >(hopeItWorks);     //把char *假装成int *

reinterpret_cast通常只是将基类指针假装成一个派生类指针而不改变其值,而static_cast则执行正确的地址操作。


4、dynamic_cast通常用于执行从指向基类的指针安全地向下转型为指向派生类的指针(仅用于多态类型,也就是说被转型的表达式的类型,必须是一个指向带有虚函数的类类型的指针),并且执行运行期检查工作,来判定转型的正确性。但是要付出显著的运行期开销。

const Circle *cp = dynamic_cast<const Circle * >(getNextShape() );

if( cp)    {.....} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值