标准c++中主要有四种强制转换类型运算符:
const_cast,reinterpret_cast,static_cast,dynamic_cast等等。
1、static_cast 是静态转换,只能用于类型兼容的转换(由宽向窄), 无RUNTIME损耗 可以用来对多态对象的指针进行高效的downcasting,但是当被转换的指针实际上指向错误的派生类时,它没有提供错误检测
static_cast(expression)将expression转换到独立地基于表达式中给出的类型type_id类型。没有运行类型检查被执行以确保转换的安全性。static_cast运算符可被用在例如转换一个基类指针到一个派生类指针的操作,这样的转换不总是安全的,相对而言,dynamic_cast是安全的。
(注意:static_cast<>()转换只是返回当前强制类型转换过后的值,也就是说,使用该操作符进行强制类型转换的时候,并不改变用于转换的源值,而只是暂时借用源值转换并保存值,所以要定义另外一个变量来保存转换以后的值。)
例:
class B { ... }; class D : public B { ... }; void f(B* pb, D* pd) { D* pd2 = static_cast<D*>(pb); // 不安全, pb可能只是B的指针 B* pb2 = static_cast<B*>(pd); // 安全的 ... } |
2、 dynamic_cast 是动态转换,主要用于base向derived的转换,就是说对象本身包含了自己的type information,这个type information在转换过程中不会损失
例:
class A { ... }; class B { ... }; void f() { A* pa = new A; B* pb = new B; void* pv = dynamic_cast<void*>(pa); // pv 现在指向了一个类型为A的对象 ... pv = dynamic_cast<void*>(pb); // pv 现在指向了一个类型为B的对象 } |
3、reinterpret_cast运算符允许任何指针被转换到任何其它指针类型,它还允许 任何整型转换到任意指针类型,且反之亦然。滥用reinterpret_cast运算符可轻易导致不安全,除非是所期望的转换是固有的低等级,否则你应使用其它转换运算符之一。
例:
class A { ... }; class B { ... }; void f() [Page] { A* pa = new A; void* pv = reinterpret_cast<B*>(pa); // pv 现在指向了一个类型为B的对象,这可能是不安全的 ... } |
4、const_cast运算符可被用于从一个类中除去const、volatile和_ _unaligned属性任何对象类型的指针或一个数据成员的指针可被显式地转换到完全相同的类型,带const,volatile和__unaligned限定符除外。对指针和引用,结果将指向源对象,对数据成员指针结果和数据成员的源指针一样指向同一成员。由于依赖于引用对象的类型,通过指针、引用或数据成员指针的求结果的写操作将产生未定义的动作
例:
class A { ... }; void f() { const A *pa = new A;//const对象 A *pb;//非const对象 //pb = pa; // 这里将出错,不能将const对象指针赋值给非const对象 pb = const_cast<A*>(pa); // 现在OK了 ... } |