static_cast和reinterpret_cast

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类型转换成指针类型. 
  
  关于reinterpret_cast,使用这个操作符的类型转换,其的转换结果几乎都是执行期定义(implementation-defined)。因此,使用reinterpret_casts的代码很难移植。 
  
    reinterpret_casts的最普通的用途就是在函数指针类型之间进行转换。例如,假设你有一个函数指针数组: 
  
  typedef   void   (*FuncPtr)();   //   FuncPtr   is   一个指向函数 
  //   的指针,该函数没有参数 
  //   返回值类型为void 
  FuncPtr   funcPtrArray[10];   //   funcPtrArray   是一个能容纳 
  //   10个FuncPtrs指针的数组 
  
    让我们假设你希望(因为某些莫名其妙的原因)把一个指向下面函数的指针存入funcPtrArray数组: 
  
  int   doSomething(); 
  
    你不能不经过类型转换而直接去做,因为doSomething函数对于funcPtrArray数组来说有一个错误的类型。在FuncPtrArray数组里的函数返回值是void类型,而doSomething函数返回值是int类型。 
  
  funcPtrArray[0]   =   &doSomething;   //   错误!类型不匹配 
  reinterpret_cast可以让你迫使编译器以你的方法去看待它们: 
  funcPtrArray[0]   =   //   this   compiles 
  reinterpret_cast<FuncPtr>(&doSomething); 
  
    转换函数指针的代码是不可移植的(C++不保证所有的函数指针都被用一样的方法表示),在一些情况下这样的转换会产生不正确的结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值