你也许还不知道const_cast,static_cast,dynamic_cast,reinterpret_cast的区别吧?

       [QQ群: 189191838,对算法和C++感兴趣可以进来]

      开篇立意

       C++中各种转换令人眼花缭乱,看似差不多,实际差很多,而且在当今时间,做一个"差不多先生"其实挺难的,一不小心可能就被社会淘汰了。

       数据转换(当然也包括各种对象类型的转换)是我们经常用到的,比如说一个Int转换成一个double之类的等等。如果说一个人什么样的场合穿什么样的衣服,说什么样的话是一件非常重要的事情。那么,对于什么样的数据对象用什么样的转换方式也是very important!本篇将对标题上的四种转换方式一一描述。

       reinterpret_cast  直接转换

       这是所有转换里面最简单粗暴的方式了,和一个男生喜欢一个女生,然后直接按倒在地差不多性质。有时候效果很好,速度很快,但是危险很高,指不定就是一个强奸罪,所以用的很少。

1     int *m;
2     char *ch=(char*)m;
3     char ch1=reinterpret_cast<char> (m);//和上面的效果是一样的,不进行检查,直接转换

      看了上面的代码,想必大家知道了它的作用了。在实际中,除非确定可以转换成功,否则尽量别用。

      static_cast

      编译器中的所有隐式转换都可以用static_cast来显示的完成,一般来说只有可隐式转换时,static_cast之间的转换才是合法的。我这里说的是一般,那就还有特殊,特殊就是继承类和父类层次转换,具体稍后再说。

      那么既然可以隐式转换为什么需要显示的用static_cast转换呢?当然,程序的易读性是一个考虑的因素,还有几个其他因素如下:

       void指针转换成其他类型指针,这种情况不用显示转换不行吧;还有改变通常的标准转换,比如int 转换成char,或者char改成int;当然还有用于类层次结构中基类和子类之间指针或引用的转换()。进行上行转换(把子类的指针或引用转换成基类表示);进行下行转换(把基类指针或引用转换成子类指针或引用)。

      

 1  class base{
 2  public:
 3       void print(){
 4          cout<<"base"<<endl;
 5      }
 6   };
 7  class child:public base{
 8   public:
 9      void print(){
10          cout<<"child"<<endl;
11      }
12  };
1     base *b=new base();
2     child *c=new child();
3     b=static_cast<child*>(c);//上行转换,子类指针转换成父类
4     b->print();
1     base *b=new base();
2     child *c=new child();
3     c=static_cast<child*>(b);//下行转换,父类指针转换成子类
4     b->print();

     这里特别注意,由于下行转换没有动态类型检查,所以是不安全的。而dynamic_cast会进行检查。

     dynamic_cast

      dynamic_cast转换的对象必须是类的指针或者引用,和void*;

      dynamic_cast是运行时是会进行类型检查的。并且这个信息存储在类的虚函数表中,只有存在虚函数的类才会虚函数表,对没有虚函数的类进行转换会导致编译错误。

      还是上面那个例子:如果改成下面,在下行转换的时候因为父类没有定义虚函数,所以会编译错误。

1 base *b=new base();
2     child *c=new child();
3     c=dynamic_cast<child*>(b);//下行转换,父类指针转换成子类
4     b->print();

     当然,在上行转换的时候效果和static_cast<>;是一样的。

     所以dynamic_cast一般是在多态中上下行转换比较多见。如果转换到指针类型失败了,dynamic_cast的结果是0;如果是引用的时候失败了,它则会抛出一个bad_cast类型的异常。

    const_cast

    顾名思义,它似乎应该用于和const相关。也的确如此,他就是remove或者add表达式的const性质。

1 int x=9;
2 const int *y=const_cast<int*>(&x);

下面是remove它的const性质

1 const int x=9;
2 int *y=const_cast<int*>(&x);

   本文把四种显示转换的用法基本都有所涉猎,希望对大家有所帮助。错误处请指正!不甚感谢!

 

参考文献:http://stackoverflow.com/questions/28002/regular-cast-vs-static-cast-vs-dynamic-cast

               http://stackoverflow.com/questions/332030/when-should-static-cast-dynamic-cast-const-cast-and-reinterpret-cast-be-used

               http://blog.csdn.net/bzhxuexi/article/details/17021559

 

 转载请注明出处:http://www.cnblogs.com/xiaoyi115/p/3629696.html

 

posted @ 2014-03-27 23:31  白来了123  阅读(1192)  评论(0编辑  收藏  举报