1、static_cast
转型
旧式 :(type) expression
例:
int a=12,b=6;
double result=((double)a)/b;
现在:static_cast<type>(expression)
double result=static_cast<double>(a)/b;
2、const_cast
只可以用来移除表达式的常量性(或易变性)。
class Widge{...}//基类
class SpecialWidge:public Widge{...}//继承类
void update(SpecialWidge *psw);
SpecialWidge sw;//继承类对象
const SpecialWidge &csw=sw;//csw是代表sw的引用,视之为const对象
update(&csw);//错。不能将const SpecialWidge *传给需要SpecialWidge *的函数
update(const_cast<SpecialWidge *>(&csw));//对。&csw的常量性被移除了
update((SpecialWidge*)&csw);//同上。旧式写法
Widge *pw=new SpecialWidge;
update(pw);//pw是基类指针Widge*,update()需要参数SpecialWidge*
update(const_cast<SpecialWidge*>(pw));//错。const_cast只能改变常量性,无法进行继承体系的向下转型动作
3、dynamic_cast
只能用在继承体系中,将“指向基类对象的指针或引用”转型为“指向继承类对象的指针或引用”
若转型失败,会以一个null指针(当转型对象是指针)或一个exception(当转型对象是引用)表现出来。
Widge *pw;
...
update(dynamic_cast<SpecialWidge*>(pw));//对。传给update()一个指针,指向pw所指的SpecialWidge
//若pw真指向这样的东西。否则,传过去的是null指
void updateViaRef(SpecialWidge &rsw);
updateViaRef(dynamic_cast<SpecialWidge&>(*pw));//对。传给updateViaRef()的是pw指向的SpecialWidge
// 若pw真指向这样的东西。否则抛出一个exception
int a=4,b=2;
double result=dynamic_cast<double>(a)/b;//错。未涉及继承体系
const SpecialWidge sw;
...
update(dynamic_cast<SpecialWidge*>(&sw));//错。dynamic_cast不能改变常量性
4、reinterpret_cast
转换函数指针类型。
例:
设有一数组,存储的是函数指针,有特定类型:
typedef void (*FuncPtr)();//FuncPtr是函数指针,指向某个函数,该函数无参数,返回类型为void
FuncPtr funcPtrArray[10];//funcPtrArray是个数组,有10个FuncPtr
若想将以下函数的一个指针n放入该数组:
int dosomething();
dosomething的类型与funcPtrArray接受的类型不同。funcPtrArray内各函数指针所指向的函数返回类型是void
funcPtrArray[0]=&dosomething;//错
funcPtrArray[0]=reinterpret_cast<FuncPtr>(&dosomething);//对。
函数指针的转型动作不具移植性(C++不保证所有的函数指针都能以此方式重新呈现)。某些情况下这样的转型可能会导致不正确的结果