类型转换

来源:互联网 发布:萌妹子语音软件 编辑:程序博客网 时间:2024/06/09 20:34
C++有四种格式的类型转换。
  1. static_cast(expr)
  2. dynamic_cast(expr)
  3. const_cast(expr)
  4. reinterpret_cast(expr)
  
  与旧的C类型转换相比, C类型转换比较强大, 但可控性差, 很难保证类型转换的安全性。 C++将C类型转换细分成4种类型转换,细分后类型转换变得更烦琐, 这样使程序更容易控制, 使类型转换能够安全的进行。因为程序员进行类型转换的时候,必须考虑清楚进行何种类型转换,才能让类型转换顺利进行。
  
  
  1. static_cast(expr)
  
  static_cast一般用与: a. 基础类型的转换,如int 转 double, 等。 b. 继承类之间的向上和向下的转换。 c. 将void*指针转换成任意类型的指针, 将任意类型的指针转换成 void*.
  
  2. dynamic_cast(expr)
  
  dynamic_cast用与:(只限于对指针和引用的转换) a. 在向上转换的时候, 和static_cast的效果是一样的, 但是向下转换的时候, 它会进行类型检查(运行时类型检查)。 比static_cast更具有安全性。 static_cast不检查安全性。 
  b. 交叉转换, 这是static_cast不具备的。 即继承于同一个基类的两个两个子类的指针可用这个转换, 虽然转换后的结果可能返回的是NULL或者抛异常,但编译是可以通过的(没用的转换)。 注意: 对指针转换时, 失败是返回NULL, 对引用的转换,失败是抛出一个异常。
  
  还要注意一点的是, 因为该转换用了运行时类型检查, 而类型时检查是写在虚函数表里面的, 如果没用该表, 也就用不了运行时检查, 因此,该转换的类型中, 一定要存在虚函数.
  
  3. const_cast(expr)
  
  特有的专用于去除const特性 或者是 volatile属性。 慎用, 一个变量使用这些属性, 一般都有特定的用途, 去除这些属性,可能读程序用破坏作用。
  
  4. reinterpret_cast(expr)
  
  一般用于函数指针的转换, 慎用。因为不是同一个类型的函数指针, 它的返回值,或者参数 是不一样的, 转换后会出现不可预料的错误。
  
  二. C风格的类型转换
   它是不考虑这些问题, 只要用该形式的转换,上面这4种情况转换都可以成功, 这样程序员可能自己都没弄清楚到底是否应该转,就迷迷糊糊的用上了, 造成转换的滥用。 给程序造成极大的安全隐患。