*_cast的用法(转)

作者在 2007-03-28 22:29:00 发布以下内容

const_cast<>去掉const变量的常量性。
 如有 constinti=6;
  int*p;
 则: p=&i;   //非法
  p=const_cast<int*>(i); //合法

static_cast<>相当于C中的强制类型转换

dynamic_cast<>则是类类型向下转换。

reinterpret_cast<>则是按内存中的布局强制转换,跟平台相关。


尽量使用C++风格的类型转换:
 
  仔细想想地位卑贱的类型转换功能(cast),其在程序设计中的地位就象goto语句一样令人鄙视。但是它还不是无法令人忍受,因为当在某些紧要的关头,类型转换还是必需的,这时它是一个必需品。  
  不过C风格的类型转换并不代表所有的类型转换功能。  
  一来它们过于粗鲁,能允许你在任何类型之间进行转换。不过如果要进行更精确的类型转换,这会是一个优点。在这些类型转换中存在着巨大的不同,例如把一个指向const对象的指针(pointer-to-const-object)转换成指向非const对象的指针(pointer-to-non-const-object)(即一个仅仅去除const的类型转换),把一个指向基类的指针转换成指向子类的指针(即完全改变对象类型)。传统的C风格的类型转换不对上述两种转换进行区分。(这一点也不令人惊讶,因为C风格的类型转换是为C语言设计的,而不是为C++语言设计的)。  
  二来C风格的类型转换在程序语句中难以识别。在语法上,类型转换由圆括号和标识符组成,而这些可以用在C++中的任何地方。这使得回答象这样一个最基本的有关类型转换的问题变得很困难:“在这个程序中是否使用了类型转换?”。这是因为人工阅读很可能忽略了类型转换的语句,而利用象grep的工具程序也不能从语句构成上区分出它们来。  
  C++通过引进四个新的类型转换操作符克服了C风格类型转换的缺点,这四个操作符是,   static_cast,   const_cast,   dynamic_cast,   和reinterpret_cast。在大多数情况下,对于这些操作符你只需要知道原来你习惯于这样写,  
  (type)   expression  
  而现在你总应该这样写:  
  static_cast<type>(expression)  
  例如,假设你想把一个int转换成double,以便让包含int类型变量的表达式产生出浮点数值的结果。如果用C风格的类型转换,你能这样写:  
  int   firstNumber,   secondNumber;  
  ...  
  double   result   =   ((double)firstNumber)/secondNumber;  
  如果用上述新的类型转换方法,你应该这样写:  
  double   result   =   static_cast<double>(firstNumber)/secondNumber;  
  这样的类型转换不论是对人工还是对程序都很容易识别。  
  static_cast在功能上基本上与C风格的类型转换一样强大,含义也一样。它也有功能上限制。例如,你不能用static_cast象用C风格的类型转换一样把struct转换成int类型或者把double类型转换成指针类型,另外,static_cast不能从表达式中去除const属性,因为另一个新的类型转换操作符const_cast有这样的功能。  
  其它新的C++类型转换操作符被用在需要更多限制的地方。const_cast用于类型转换掉表达式的const或volatileness属性。通过使用const_cast,你向人们和编译器强调你通过类型转换想做的只是改变一些东西的constness或者   volatileness属性。这个含义被编译器所约束。如果你试图使用const_cast来完成修改constness   或者volatileness属性之外的事情,你的类型转换将被拒绝。下面是一些例子:  
  class   Widget   {   ...   };  
  class   SpecialWidget:   public   Widget   {   ...   };  
  void   update(SpecialWidget   *psw);  
  SpecialWidget   sw;                                 //   sw   是一个非const   对象。  
  const   SpecialWidget&   csw   =   sw;       //   csw   是sw的一个引用 

C++语法 | 阅读 3714 次
文章评论,共0条
游客请输入验证码
浏览67815次