前言
對於C++代碼中的類型轉換,我從來都習慣用C風格轉換(在C++中被稱爲舊式轉換)。實際上,我寫的很多代碼都很少注重效率。而在新公司裏一位對C++代碼效率要求極高的team leader看過我寫的代碼後,直接建議我去讀下《effective c++》,說這本書是從業餘程序員到專業程序員的分水嶺。 呵呵,自嘆不如啊。 寫了那麼多年的C++,而今還被人看做業餘程序員,情何以堪! 事實上,這本書我很早以前就看過,只是一直感覺裏面很多都太苛刻,所以很少注意。 說到這,不得不爲自己以前的浮躁自責。其實被人笑作業餘程序員也就不足爲怪了。 突然感覺自己鑽的不夠深,那麼從今日起,就得在C++代碼效率方面更用功些了。
進入主題
對於C++的4種類型轉換,static_cast相當於C語言中的函數式轉換; dynamic_cast通常用來將基類對象或指針轉換爲子類對象或指針; const_cast用來去除對象或變量的常量性; reinterpret_cast只進行二進制級別的比特轉換,在實際應用中很少用到. 看看如下代碼:
- #include <iostream>
- using namespace std;
- class Window
- {
- private:
- public:
- virtual void ShowWindow()
- {
- cout<<"base class window"<<endl;
- }
- };
- class MDIWindow:public Window
- {
- public:
- virtual void ShowWindow()
- {
- Window::ShowWindow();
- cout<<"derived class window"<<endl;
- }
- };
- int main(int *argc , char **argv)
- {
- int nValue;
- float fValue = 10.0f;
- nValue = static_cast<int>(fValue);
- cout<<"nValue is : "<<nValue<<endl;
- const char* pszStr = "abcdefg";
- char *pszStr1 = const_cast<char*>(pszStr);
- cout<<"pszStr is : "<<pszStr<<endl;
- cout<<"pszStr1 is : "<<pszStr1<<endl;
- Window *pWindow;
- MDIWindow *pMdiWindow = new MDIWindow();
- pWindow = static_cast<Window*>(pMdiWindow);
- pWindow->ShowWindow();
- if (MDIWindow *pTempMdiWindow = dynamic_cast<MDIWindow*>(pWindow))
- {
- pTempMdiWindow->ShowWindow();
- }
- else
- {
- cout<<"dynamic_cast error!"<<endl;
- }
- delete pMdiWindow;
- return 0;
- }
在effective c++中,作者建議在高效要求的代碼中,儘量少使用或者不適用強制類型轉換,因爲每次轉換都會增加或多或少的運行成本,尤其是dynamic_cast,而reinterpret_cast也往往會帶來意想不到的BUG。 而對於C風格的轉換和C++風格的轉換,作者也建議儘量使用C++類型轉換,正如作者所說“C++風格容易辨識出來,而且有着分門別類的執掌”。
最後順便感嘆一下51CTO對WLW的代碼tags的支持真的很讓人無語。。 在WLW官網下載了很多代碼tags,發佈出來的文章中代碼大多都成亂碼了,不知51CTO什麼時候能改善下。。。