隨想錄(寫給自己的C++編程規範)

來源:互聯網
上載者:User

【 聲明:著作權,歡迎轉載,請勿用於商業用途。  聯絡信箱: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你是搞得定的

  

  

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.