C++类型转换

LIZHAO 编程技术
阅读量 0 评论量 0

C++中提供四种强制类型转换运算符

  1. static_cast
    强制类型转换,在编译期间进行检查,不会再运行时来检查转换是否安全。
    常用于类型的强转,例如int转double, 指针转void * 或者void *转某个类型的指针
    也可以用于基类、派生类的指针的相互转换,但是派生类对象指针转成基类对象指针是安全的,反过来就不是安全的。
  2. const_cast
    用于去const的转换,把常量转换为可以被修改的变量。
  3. dynamic_cast
    使用dynamic_cast转换时,类中必须存在虚函数,也就是转换的类型能够发生多态。
    dynamic_cast 可以在运行时检查转换是否安全,如果不安全,则返回的是空指针。
    例如当一个派生类中存在基类不存在的成员时,将一个派生类的指针转换为基类指针是不安全的,这个时候使用dynamic_cast得到的就是一个空指针。
    例 dynamic_cast
    class 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
    
  4. reinterpret_cast
    可以将一个指针转换成一个整型,也可以把一个整型转换成一个指针。
    它是这四种转换运算符中最不安全的,它主要适用于依赖底层实现的编程技术,因为不系统一个类型存储的字节可能是不一样的,所以具有不可移植性、对平台的依赖性强。
喵~