C++中提供四种强制类型转换运算符
- static_cast
强制类型转换,在编译期间进行检查,不会再运行时来检查转换是否安全。
常用于类型的强转,例如int转double, 指针转void * 或者void *转某个类型的指针
也可以用于基类、派生类的指针的相互转换,但是派生类对象指针转成基类对象指针是安全的,反过来就不是安全的。 - const_cast
用于去const的转换,把常量转换为可以被修改的变量。 - dynamic_cast
使用dynamic_cast转换时,类中必须存在虚函数,也就是转换的类型能够发生多态。
dynamic_cast 可以在运行时检查转换是否安全,如果不安全,则返回的是空指针。
例如当一个派生类中存在基类不存在的成员时,将一个派生类的指针转换为基类指针是不安全的,这个时候使用dynamic_cast得到的就是一个空指针。
例 dynamic_castclass Base { public: virtual void hello() {} }; class Derived : public Base { public: int b; }; int main() { Base *basePtr = new Base(); Base *basePtr1 = new Derived(); Derived *derived1 = nullptr; derived1 = dynamic_cast<Derived *>(basePtr); if (!derived1) { std::cout << "derived1 nullptr 1" << std::endl; } derived1 = dynamic_cast<Derived *>(basePtr1); if (!derived1) { std::cout << "derived1 nullptr 2" << std::endl; } return 0; } //outputs: derived1 nullptr 1
- reinterpret_cast
可以将一个指针转换成一个整型,也可以把一个整型转换成一个指针。
它是这四种转换运算符中最不安全的,它主要适用于依赖底层实现的编程技术,因为不系统一个类型存储的字节可能是不一样的,所以具有不可移植性、对平台的依赖性强。