前言

对于C++代码中的类型转换,我从来都习惯用C风格转换(在C++中被称为旧式转换)。实际上,我写的很多代码都很少注重效率。而在新公司里一位对C++代码效率要求极高的team leader看过我写的代码后,直接建议我去读下《effective c++》,说这本书是从业余程序员到专业程序员的分水岭。 呵呵,自叹不如啊。 写了那么多年的C++,而今还被人看做业余程序员,情何以堪! 事实上,这本书我很早以前就看过,只是一直感觉里面很多都太苛刻,所以很少注意。 说到这,不得不为自己以前的浮躁自责。其实被人笑作业余程序员也就不足为怪了。 突然感觉自己钻的不够深,那么从今日起,就得在C++代码效率方面更用功些了。

 

进入主题

对于C++的4种类型转换,static_cast相当于C语言中的函数式转换; dynamic_cast通常用来将基类对象或指针转换为子类对象或指针; const_cast用来去除对象或变量的常量性; reinterpret_cast只进行二进制级别的比特转换,在实际应用中很少用到. 看看如下代码:

 

 

   
   
   
   
  1. #include  
  2.  
  3. using namespace std; 
  4.  
  5.  
  6. class Window 
  7. private
  8. public
  9.     virtual void ShowWindow() 
  10.     { 
  11.         cout<<"base class window"<
  12.     } 
  13. }; 
  14.  
  15. class MDIWindow:public Window 
  16. public
  17.     virtual void ShowWindow() 
  18.     { 
  19.         Window::ShowWindow(); 
  20.         cout<<"derived class window"<
  21.     } 
  22. }; 
  23.  
  24. int main(int *argc , char **argv) 
  25.     int nValue; 
  26.     float fValue = 10.0f; 
  27.      
  28.     nValue = static_cast<int>(fValue); 
  29.     cout<<"nValue is : "<
  30.      
  31.     const char* pszStr = "abcdefg"
  32.     char *pszStr1 = const_cast<char*>(pszStr); 
  33.  
  34.     cout<<"pszStr is : "<
  35.     cout<<"pszStr1 is : "<
  36.  
  37.     Window *pWindow; 
  38.     MDIWindow *pMdiWindow = new MDIWindow(); 
  39.     pWindow = static_cast(pMdiWindow); 
  40.  
  41.     pWindow->ShowWindow(); 
  42.  
  43.     if (MDIWindow *pTempMdiWindow = dynamic_cast(pWindow)) 
  44.     { 
  45.         pTempMdiWindow->ShowWindow(); 
  46.     } 
  47.     else 
  48.     { 
  49.         cout<<"dynamic_cast error!"<
  50.     } 
  51.  
  52.     delete pMdiWindow; 
  53.     return 0; 

 

在effective c++中,作者建议在高效要求的代码中,尽量少使用或者不适用强制类型转换,因为每次转换都会增加或多或少的运行成本,尤其是dynamic_cast,而reinterpret_cast也往往会带来意想不到的BUG。 而对于C风格的转换和C++风格的转换,作者也建议尽量使用C++类型转换,正如作者所说“C++风格容易辨识出来,而且有着分门别类的执掌”。

 

最后顺便感叹一下51CTO对WLW的代码tags的支持真的很让人无语。。 在WLW官网下载了很多代码tags,发布出来的文章中代码大多都成乱码了,不知51CTO什么时候能改善下。。。