本文共 1435 字,大约阅读时间需要 4 分钟。
C++风格的类型转换提供了四种类型转换操作符,分别适用于不同的场景。以下是对每种转换的详细分析:
const_cast 用于去掉类型的 const 或 volatile 属性。例如:
struct SA { int i;};const SA ra;// ra.i = 10; 直接修改 const 类型,编译错误SA & rb = const_cast (ra);rb.i = 10; // 可以正常修改 static_cast 类似于 C 风格的强制转换,无条件转换,适用于基本类型和类之间的转换。例如:
int n = 6;double d = static_cast(n); // 基本类型转换int* pn = &n;double* d = static_cast (pn); // 无关类型指针转换,编译错误void* p = static_cast (pn); // 任意类型转换成 void 类型
dynamic_cast 用于动态类型转换,需要运行时类型信息,通常用于多态类。例如:
class BaseClass { public: int m_iNum; virtual void foo(){}; // 基类必须有虚函数};class DerivedClass: public BaseClass { public: char* m_szName[100]; void bar(){};};BaseClass* pb = new DerivedClass();DerivedClass* pd1 = static_cast (pb); // 子类 → 父类,静态类型转换,正确但不推荐DerivedClass* pd2 = dynamic_cast (pb); // 子类 → 父类,动态类型转换,安全BaseClass* pb2 = new BaseClass();DerivedClass* pd21 = static_cast (pb2); // 父类 → 子类,静态类型转换,危险DerivedClass* pd22 = dynamic_cast (pb2); // 父类 → 子类,动态类型转换,安全 reinterpret_cast 仅重新解释类型,不执行二进制转换,通常用于指针和算术类型。例如:
int doSomething(){return 0;};typedef void (*FuncPtr)();FuncPtr funcPtrArray[10];funcPtrArray[0] = reinterpret_cast (doSomething); // 不同函数指针类型之间进行转换 转载地址:http://mlpuz.baihongyu.com/