【 聲明:著作權,歡迎轉載,請勿用於商業用途。 聯絡信箱:feixiaoxing @163.com】
對於我這樣一個C語言的程式員來說,編寫C++的機會其實不太多。但是我還是比較喜歡寫C++語言,原因主要有幾個方面:(1)自己學C++語言的時間比較長了,也比較瞭解,如果從大一的時候算起,現在也有小十年了;(2)windows下面的開發工具確實很好用,比如調試器調用、彙編代碼查看也方便,學起來其實沒有什麼障礙;(3)基於C++語言的開源項目還是比較多的,比如說的eMule、webkit、notepad++、libsvm,掌握好C++語言對自己的協助還是挺大的。
和很多朋友一樣,我自己的C++學習也是非常曲折的,這其中主要有下面幾個階段。剛開始,在大一剛剛入學的時候,我們集中學習了C++的基本文法,其實我也不清楚為什麼要在大學設定C++這門這麼難的語言,其實對於很多工科的同學來說,C語言已經是綽綽有餘了,況且能把C語言學好本身就已經很不錯了。後面,隨著C++的瞭解,我開始用MFC編寫一些小程式,什麼串口工具、聊天工具、FTP下載工具、影像處理工具等等,這個時候看得比較多的就是侯捷的《深入淺出MFC》。當然後來隨著MFC使用的頻繁,對C++語言的瞭解也更加深入,這個時候更多地關注C++語言的實現細節,什麼《Effective C++》、《C++ Template》、《Inside the C++ object》、《Effective STL》,此時恨不得不自己會的所有技巧都用上,充分發揮C++的特性。等到工作之後,由於工作的關係更加偏重於即時作業系統,自己對程式設計語言有了新的認識,不再盲目追求語言的特性,而是更注重系統的穩定、項目的開發進度和語言本身的簡潔和高效。無疑,在這些要求下面,C語言就是最佳的選擇,因為你可以清楚地瞭解每一行語句後面CPU都幫我們做了些什麼。我看過的很多作業系統代碼,比如ucos、rt-thread、linux、vxworks都是用C語言編寫的,很簡潔也很高效。
網上有位知名的朋友叫雲風,早期在他寫的書《我的編程感悟》當中也是對C++大加褒獎,可是在後來的工程實踐中反而感覺到C語言才是最好用的語言。相信很多的朋友都有類似的經驗。當然,不可否認C++還是存在很大的市場,但是它的應用範圍和過去相比,確實是大大縮小了。一方面,精通C++的人實在是太少了,用好C++的人更是鳳毛麟角;另外一方面,C++的學習代價、應用代價實在是很高,你沒有辦法要求項目組裡邊的每個人都有很高的C++應用水平,這是沒有辦法做到的,就算做到了,代價是十分昂貴的。所以,為了消除彼此成員之間的差別,很多時候C++的編程規範就變成了C語言的編程規範,這可以從google C++ style guide可以看出來。
所以,今天這裡寫這篇文章,主要是就C++寫一些自己的總結,談談自己的看法,歡迎各位提出寶貴意見。
(1) 總則
a)盡量選擇所有編譯器都支援的C++標準
b)必須瞭解類的記憶體分布結構
c)必須瞭解編譯器對C++的隱形操作
d)指標是所有錯誤的來源,盡量用引用代替
e)用const對入參、出參和類函數進行限制
f)多用namespace限定類的作用範圍
g)少用C++的進階特性
h)時刻在需要處理C檔案的時候添加extern “C”
i)string類是萬惡之源,盡量少用
(2)標頭檔
a)定義標頭檔的時候首先添加編譯宏
b)添加最少的標頭檔依賴
c)標頭檔名爭取和類名一致
d)標頭檔中只包括類型定義、宏定義和函式宣告
e)類的標頭檔和實現檔案一一對應
(3)命名
a)類的命名按照首字母大寫的格式進行,比如Parent
b)宏按照全大寫的格式進行,比如MAX
c)函數按照小寫進行,中間用連詞號串連,比如get_max_number
d)變數按照一個單詞進行,比如number,index等等
e)變數、函數多用static限定範圍,類多用namespace限定範圍
(4)函數
a)杜絕可變參的函數,不利於編譯器檢查
b)少用全域函數
c)函數入參多用參考型別
d)傳回值多用參考型別,但是臨時變數不能用引用
e)全域函數少用重載,最好不用
f)最好不用使用模板函數,即使使用也只限定於自己使用
(5)類
a)少用繼承,多用組合
b)對於建構函式,多用explicit,防止編譯器強行轉換
c)對於指標成員變數,務必注意拷貝建構函式和賦值函數的編寫
d)對於類指標,為了防止記憶體流失或者資源重複釋放,最好自己管理,不要相信智能指標
e)繼承類中的解構函式要定義為virtual類型
f)建構函式要簡單,複雜的資源分派請在類成員函數init中定義
g)對於全域類變數,相互定義之間不要存在依賴
h)嚴格區分類指標的釋放,注意delete和delete[]的區別
i)對於類中鎖的問題,可以利用類的構造、析構、引用特性解決
j)多用class,少用struct
(6)類的進階特性
a)不要使用算術符重載
b)不要用模板,除非自己用,自己用也要少用
c)不用使用C++中的typeid屬性
d)不要用異常
e)不要用virtual繼承
f)不要用多類繼承
g)不用要stl,當類中存在指標變數的時候,stl很多時候是搞不定的,而vector、list、find、sort你是搞得定的