时间: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式风格类型转型,提高了代码的可读性和安全性。另外这四个转型操作符各司其职,各有各的用途,不要混用。