CPP_四种cast

C++中cast主要用于强制类型转换

1.C的强制类型转换(所谓的“旧式转换”)

int x=(int)'a';

在C里够用,但是在面向对象编程就有点捉襟见肘

2.const_cast
用于修改类型的const或volatile属性,一般用于强制消除对象的常量性,C不提供这一机制

 class C{};
 const C * ptr=new C;
 C *ptr1=const_cast<C*> ptr;//移除const

3.static_cast
该cast没有检查类型,可能导致安全性问题。主要用法有: (1)用于基本数据类型 (2)把空指针转换为目标类型的指针 (3)将任何类型表达式转为void类型 (4)将子类类型的指针转化为父类类型的指针(这种操作安全性交给开发者处理)

   class a{};
   class b:public a{};
   a* ptr=new a;
   b * ptr1=static_cast<b*>(a);

4.dynamic_cast

 只用于对象的指针和引用,用于多态类型时,允许任意形式的隐式转换以及相反过程。在隐式转换的相反过程中,dynamic_cast会进行有效性检查(static_cast不会检查)。检查在运行时进行。它可以将指向子类的父类指针转化为子类指针,但是要求父类有虚函数,当转换失败,返回NULL,异常抛出bad_cast异常。(为什么要求虚函数?)

 Class base{virtual void func(){}};
 class ch:public base{};

  base * ptr=new base;
  base *ptr1=new ch;

  ch *cast_test=dynamic_cast<ch *> ptr;//NULL
  ch* case_test=dynamic_cast<ch *> ptr1;//success

5.reinterpret_cast

它可以实现将一个指针转换为其他类型的指针,也允许从一个指针转化为整数类型。
 (1)实现基础类型转换(不安全)
 (2)类指针上行转换(从派生类到父类(基类))是安全的
 (3)类下行转换(从父类到派生类)是不安全的
 (4)转换空指针类型;
     (有点像传统的类型转换,不过加了类相关支持)

总结:

constcast用于const类型的设置与取消。 staticcast用于基本数据类型、子类父类指针转换(无安全检查)、包括将任意类型指针转为void类型 dynamiccast主要用于一个父类指针指向子类,然后期望把父类指针转化为子类的状况的指针转换(有安全性检查,要求父类有虚函数) reinterpretcast最为粗暴,无检查,不安全,但是应用广泛。

panda

继续阅读此作者的更多文章