c中的旧式转型:
char* hopeItWorks = (char*) 0x00ff0000;
C++的转型(函数形式):
typedef char* PChar;
hopeItWorks = PChar(0x00ff0000);
4个新式转型操作符:
1. const_cast
允许添加或移除表达式中类型的const 或volatile修饰符。
const Person* getEmployee(){};
Person* anEmployee = const_case<Person *>(getEmployee());
2.static_cast
用于相对而言可跨平台移植的转型;最常用的情况是,它用于将一个继承层次结构中的基类的指针或引用,向下转型为一个派生类的指针或引用。
eg1. Shape* sp = new Circle;
Cirecle* cp = static_cast<Circle*>(sp);
eg2.constShape* getNextShape(){};
Circle* cp = static_cast<Circle*>(const_cast<Shape*>(getNextShape()));
3.reinterpret_cast
它从位(bit)的角度看待一个对象,从而允许将一个东西看作另一个完全不同的东西。但它可能不具移植性。
eg.
int * hopeless = reinterpret_cast<int *>(hopeItworks);
Note:注意区分当分别使用reinterpret_cast和static_cast将指向基类的指针向下转型为指向派生类的指针时的行为,reinterpret_cast 通常只是将基类指针假装成一个派生类指针而不改变其值,而static_cast(以及旧式转型-从这个角度来说),则将执行正确的地址操作。
4. dynamic_cast
通常用于执行从指向基类的指针安全得向下转型为指向派生类的指针,不同于static_cast的是,dynamic_cast仅用于对多态类型进行向下转型(被转型的表达式的类型,必须是一个指向带有虚函数的类类型的指针),并且执行运行期间检查工作,来判断转型的正确性。当然,这种安全性是要付出代价的 ,要付出显著的运行期开销,而static_cast 开销极少。虽然安全,但只是偶尔用用,不能滥用。
eg.
constCircle* cp = dynamic_cast<const Circle*>(getNextShape());
if(cp)
{……}