C++中的转型操作符

来源:互联网 发布:稀疏矩阵乘法 编辑:程序博客网 时间:2024/04/29 06:23

时间:2014.03.05

地点:基地一楼

————————————————————————————————

一、简述

  程序设计中让用到转型操作符,而旧式的C类型转型有很多缺陷,它几乎允许将任何类型转换为任何其他类型,C++中引入了4个新的转型类型操作符,使得类型转型时意图更加明确。这四个新转型操作符分别是:static_cast,const_cast,dynamic_cast,reinterpret_cast。

————————————————————————————————

二、用法

  各个转型操作符用法格式比如:

static_cast<type>(expression);

假如我们想将一个int转型为一个double,以强迫一个整数表达式导出一个浮点数值,如下:

int first_number;int second_number;double result=static_cast<double>(first_number)/second_number;
statci_cast和旧式的C风格类型转型具有相同的意义和地位,以及限制,但显然使用static_cast使得代码意图更加明显。

******************************************************************

再来看一个const_cast,它的作用是去除变量的常量性质,使之变成普通变量使用。因为在很多场合下,我们的函数参数使用的是普通变量,而有时我们需要传进去的又是一个常量变量,特殊的常量变量只能传给特殊的常量形参,由此我们必须把特化强制转换为普通。而const_cast就是用来改变表达式的常量性和易变性的。例如:

class Widget{......};class SpecialWidget:public Widget{......};void Update(SpecialWidget *psw);SpecialWidget sw;    //sw是个普通变量const SpecialWidget& csw=sw;    //csw代表sw的一个引用,并视之为一个const对象Update(&csw);//将一个常量传给一个普通形参的函数是不对的Update(const_cast<SpecialWidget*>(&csw));    //用const_cast强制去掉它的const属性即可在该函数中用于
******************************************************************
第三个是dynamic_cast,它的作用是在继承体系中实现安全的向下转型动作。即你可以通过daynamic将指向父类型的对象转换为指向子类型的对象,并可得知是否转型成功。若转型失败,会以一个null指针或异常表现,使得代码更加安全。例如:

Widget *pw;Update(dynamic_cast<SpecialWidget*>(pw);//pw经转换后指向SpecialWidget类型void UpdateViaRef(SpecialWidget& rsw);UpdateViaRef(dynamic-cast<SpecialWidget&>(*pw);也是对的
但有一点值得注意,danamic_cast只能用于协助在继承体系中进行类型转换,而不能用于缺乏虚函数的类型上,也不能改变类型的常量性。如果你想为一个不涉及继承体系的类型进行转型,那么就像第一条那样,使用static_cast。要改变常量特性,则像第二条那样使用const_cast.

******************************************************************

还一个类型转型符是reinterpret_cast。该操作符总是与平台相关,不具有移植性,常用于函数指针转型。

假如有个存放很多函数指针的数组,比如:

typedef void (*FuncPtr) ();    //FuncPtr是个函数指针

FuncPtr funcPtrArray[10];    //funcPtrArray是个数组,内定义了10个FuncPtr指针

出于某种原因,你也希望将 int DoSomething();    函数的一个指针放入funcPtrArray中,当然很明显若不转型是不可能的,因为它的返回类型和数组定义类型不一样。

funcPtrArray[0]=&DoSomething;    //错误,类型不符

使用reinterpret_cast可以做到这一点。如:

funcPtrArray[0]=reinterpret_cast<FuncPTR>(&DoSomething);

尽管通过reinterpret_cast可以将函数指针转型,但不推荐使用,除非走投无路了。

————————————————————————————————

四、总结

  上面给出了四种C++中新定义的转型操作符,方便程序员对类型做出安全、便捷的类型转型,虽然看起来有点丑陋,但相比传统的C式风格类型转型,提高了代码的可读性和安全性。另外这四个转型操作符各司其职,各有各的用途,不要混用。

0 0
原创粉丝点击