C风格的类型转换C++完全兼容。
C++新增了四个显式类型转换运算符。
1)静态类型转换:static_cast<目标类型>
A.将基类的指针或引用转换为子类的指针或引用;
B.自定义类型转换。
它允许子类类型的指针转换为父类类型的指针(这是一个有效的隐式转换),同时,也能够执行相反动作:转换父类为它的子类,但会给出编译警告
下面的例子中,被转换的父类没有被检查是否与目的类型相一致。
class Base {};
class Derived : public Base {};
Base *a = new Base;
Derived *b = static_cast<Derived *>(a); //子类的指针指向父类的对象
基础类型之间的标准转换:
double d = 3.14159265;
int i = static_cast<int>(d);
2)动态类型转换:dynamic_cast<目标类型>
将基类的指针或引用转换为子类的指针或引用,在运行期检查基类指针或引用的目标对象是否真的是所要转换的子类类型。保证了“安全的向下转型(safe downcasting)”
它允许任意的隐式类型转换(基类指针指向子类)以及相反过程。不过,与static_cast不同,在后一种情况里(注:即隐式转换的相反过程),dynamic_cast会检查操作是否有效。
检测在运行时进行。如果被转换的指针不是一个被请求的有效完整的对象指针,返回值为NULL.
代码:
class Base { virtual dummy() {} };
class Derived : public Base {};
Base* b1 = new Derived;
Base* b2 = new Base;
Derived* d1 = dynamic_cast<Derived *>(b1); //succeeds
Derived* d2 = dynamic_cast<Derived *>(b2); // fails: returns 'NULL',在子类的指针看来,基类的对象是不完整的。bad_cast的异常类型被抛出
3)常量类型转换:const_cast<目标类型>
去除或添加指针或引用的常属性。
4)重解释类型转换:reinterpret_cast<目标类型>
A.任意类型的指针或引用之间进行转换;
B.在指针和整数之间进行转换。
这个操作符能够在非相关的类型之间转换。操作结果只是简单的从一个类型的指针到别的类型的指针的值的二进制拷贝。
例如:
A * a = new A;
B * b = reinterpret_cast<B *>(a);