“業餘程序員”小談C++類型轉換

 

前言

對於C++代碼中的類型轉換,我從來都習慣用C風格轉換(在C++中被稱爲舊式轉換)。實際上,我寫的很多代碼都很少注重效率。而在新公司裏一位對C++代碼效率要求極高的team leader看過我寫的代碼後,直接建議我去讀下《effective c++》,說這本書是從業餘程序員到專業程序員的分水嶺。 呵呵,自嘆不如啊。 寫了那麼多年的C++,而今還被人看做業餘程序員,情何以堪! 事實上,這本書我很早以前就看過,只是一直感覺裏面很多都太苛刻,所以很少注意。 說到這,不得不爲自己以前的浮躁自責。其實被人笑作業餘程序員也就不足爲怪了。 突然感覺自己鑽的不夠深,那麼從今日起,就得在C++代碼效率方面更用功些了。

 

進入主題

對於C++的4種類型轉換,static_cast相當於C語言中的函數式轉換; dynamic_cast通常用來將基類對象或指針轉換爲子類對象或指針; const_cast用來去除對象或變量的常量性; reinterpret_cast只進行二進制級別的比特轉換,在實際應用中很少用到. 看看如下代碼:

 

 

  1. #include <iostream> 
  2.  
  3. using namespace std; 
  4.  
  5.  
  6. class Window 
  7. private
  8. public
  9.     virtual void ShowWindow() 
  10.     { 
  11.         cout<<"base class window"<<endl; 
  12.     } 
  13. }; 
  14.  
  15. class MDIWindow:public Window 
  16. public
  17.     virtual void ShowWindow() 
  18.     { 
  19.         Window::ShowWindow(); 
  20.         cout<<"derived class window"<<endl; 
  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 : "<<nValue<<endl; 
  30.      
  31.     const char* pszStr = "abcdefg"
  32.     char *pszStr1 = const_cast<char*>(pszStr); 
  33.  
  34.     cout<<"pszStr is : "<<pszStr<<endl; 
  35.     cout<<"pszStr1 is : "<<pszStr1<<endl; 
  36.  
  37.     Window *pWindow; 
  38.     MDIWindow *pMdiWindow = new MDIWindow(); 
  39.     pWindow = static_cast<Window*>(pMdiWindow); 
  40.  
  41.     pWindow->ShowWindow(); 
  42.  
  43.     if (MDIWindow *pTempMdiWindow = dynamic_cast<MDIWindow*>(pWindow)) 
  44.     { 
  45.         pTempMdiWindow->ShowWindow(); 
  46.     } 
  47.     else 
  48.     { 
  49.         cout<<"dynamic_cast error!"<<endl; 
  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什麼時候能改善下。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章