一、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) {.....}