高質量C 程式設計指南讀書筆記

2021-06-19 11:07:51 字數 4999 閱讀 6472

1.每個c++檔案通常分為兩個檔案。乙個檔案用於儲存程式的宣告,稱為標頭檔案。另乙個檔案用於儲存程式的實現,稱為定義檔案。

(1)版權資訊。

(2)檔名稱,識別符號,摘要。

(4)版本歷史資訊。

* 檔名稱:filename.h

* 檔案標識:見配置管理計畫書

* 當前版本:1.1

* 作    者:sarah-琦琦

* 完成日期:22023年11月29日

* 取代版本:1.0

* 原作者  :輸入原作者(或修改者)名字

* 完成日期:2023年5月10日

3.標頭檔案結構

標頭檔案由三部分組成:

(1)標頭檔案開頭處的版權和版本宣告

(2)預處理塊

(3)函式和類結構宣告等

規則:(1)為了防止標頭檔案被重複引用,應當用#ifndef/#define/#endif結構產生預處理塊

(2)用#include 格式來引用標準庫的標頭檔案

(3)用#include "filename.h"格式來引用非標準庫的標頭檔案

(4)標頭檔案中只存放「宣告」而不存放「定義」。

在c++語法中,類的成員函式可以在宣告時被定義,並且自動成為內聯函式。雖然會給書寫帶來方便,卻造成了風格不一致,弊大於利。建議將成員 函式的定義與宣告分開,不論該函式體有多麼小。

(5)不提倡使用全域性變數,盡量不要在標頭檔案中出現像 extern int value這樣的宣告

4.定義檔案的結構分為三部分:

(1)定義檔案開頭處的版權和版本宣告;

(2)對一些標頭檔案的引用

(3)程式的實現體

5.標頭檔案的作用

(1)通過標頭檔案來呼叫庫功能。在很多場合,源**不便向使用者公布。只要向使用者提供標頭檔案和二進位制的庫即可。

(2)標頭檔案能加強型別安全檢查。

6.如果乙個軟體的標頭檔案數目比較多,通常應將標頭檔案和定義檔案分別儲存於不同的目錄以便於維護。

7.版書:

(1)每個類宣告之後,每個函式定義結束之後都要加空行。

(2)在乙個函式體內,邏輯上密切相關的語句之間不加空行,其他地方應加空行分隔

(3)一行**只做一件事情

(4)if ,for,while,do等語句自佔一行,執行語句不得緊跟其後。不論執行語句有多少都要加{}

(5)盡可能在定義變數的同時初始化該變數

8.**行內空格:

(1)關鍵字之後要留有空格。有括號的先加空格再加括號

(2)函式名之後不要留空格,緊跟左括號,以區別於關鍵字

(3)『(』向後緊跟,『)』、『,』、『;』向前緊跟,緊跟處不留空格

(4)『,』之後要留空格,如function(x, y, z)。如果『;』不是一行的結束符號,其後要留空格,如for (initialization; condition; update)。

(5)賦值操作符、比較操作符、算術操作符、邏輯操作符、位域操作符,「=」、「+=」「>=」、「<=」、「+」、「*」、「%」、「&&」、「||」、「<<」,「^」等二元操作符的前後應當加空格

(6)一元操作符如「!」、「~」、「++」、「--」、「&」(位址運算子)等前後不加空格。

(7)「[]」、「.」、「->」這類操作符前後不加空格

(8)對於表示式比較長的for語句和if語句,為了緊湊起見可以適當地去掉一些空格,如for (i=0; i<10; i++)和if ((a<=b) && (c<=d))

9.對齊

(1)程式的分界符『』應獨佔一行並且位於同一列,同時與引用它們的語句左對齊。

(2)之內的**塊在『{』右邊數格處左對齊。

10.長行拆分

(1)**行最大長度宜控制在70至80個字元以內。**行不要過長,否則眼睛看不過來,也不便於列印

(2)長表示式要在低優先順序操作符處拆分成新行,操作符放在新行之首(以便突出操作符)。拆分出的新行要進行適當的縮排,使排版整齊,語句可讀。

11.修飾符的位置

(1)應當將修飾符 * 和 & 緊靠變數名

12. 注釋

(1)注釋是對**的「提示」,而不是文件。

(2)如果**本來就是清楚的,則不必加注釋。

(3)邊寫**邊注釋,修改**同時修改相應的注釋,以保證注釋與**的一致性。不再有用的注釋要刪除。

(4)注釋應當準確、易懂,防止注釋有二義性。錯誤的注釋不但無益反而有害。

(5)盡量避免在注釋中使用縮寫,特別是不常用縮寫

(6)注釋的位置應與被描述的**相鄰,可以放在**的上方或右方,不可放在下方

(7)當**比較長,特別是有多重巢狀時,應當在一些段落的結束處加注釋,便於閱讀

13.類的版書

建議「以行為為中心」的書寫方式,即將public型別的函式寫在前面,而將private型別的資料寫在後面。這樣做不僅讓自己在設計類時思路清晰,而且方便別人閱讀。因為使用者最關心的是介面,誰願意先看到一堆私有資料成員。

14.命名規則

(1)識別符號應當直觀且可以拼讀,可望文知意,不必進行「解碼」

(2)識別符號的長丟應當符合最大字元長度和最小字元長度之間的原則。

(3)命名規則盡量與所採用的作業系統或開發工具的風格保持一致(例如windows的通常大小寫混排,unix應用程式通常是小寫 加下劃線)

(4)程式中不要出現僅靠大小寫區分的相似的識別符號

(5)程式中不要出現識別符號完全相同的區域性 變數和全域性變數,儘管兩者額作用域不同而不會發生語法錯誤,但是會使人誤解

(6)變數的名字應當使用「名字」或者「形容詞+名詞」

(7)用正確的反義詞組命名具有互斥意義的變數或相反動作的函式

(8)盡量避免名字中出現數字編號

15.簡單的windows應用程式命名規則

(1)類名和函式名用大寫字母開頭的單詞組合而成

(2)變數和引數用小寫字母開頭的單詞組合而成

(3)常量全用大寫字母,用下劃線分割單詞

(4)靜態變數前加字首s_

(5)如果不得已取藥全域性變數,則使全域性變數加字首g_

(6)為了防止某一軟體庫中的一些識別符號和其他軟體庫中的衝突,可以為各種識別符號加上能反映軟體性質的字首。

16.運算子的優先順序

(1)如果**行中的運算子比較做,用括號確定表示式的操作順序,避免使用預設的優先順序

17.復合表示式

(1)不要編寫太複雜的復合表示式

(2)不要有多用途的復合表示式

(3)不要把程式中的復合表示式與「真正的數學表示式」混淆

18.if語句

(1)不可將布林變數直接與true、false或者0, 1 進行比較

(2)整型變數與零值的比較,應當將整型變數用「==」或「!=」直接與0比較

(3)浮點變數與0比較,不可將浮點變數用「==」或者「!=」與任何數字比較

(4)指標變數與零值比較,應當將指標變數用「==」或「!=」與null比較

(5)對if語句的補充說明:if條件裡面一般把常值寫在==的前面

19.迴圈語句的效率

(1)在多重迴圈中,如果有可能,應當將最長的迴圈放在最內層,最短迴圈放在最外層,以減少cpu跨切迴圈層的次數。

(2)如果迴圈體內存在邏輯判斷,並且迴圈次數很大,宜將邏輯判斷移到迴圈體外 面。

20.for語句的迴圈控制變數

(1)不可在for迴圈體內修改迴圈變數,防止for迴圈失去控制

(2)建議for語句的迴圈控制變數的取值採用「半開半閉區間」的寫法

21.switch語句

(1)每個case語句的結尾不要忘了加break,否則將導致多個分支重疊,除非有意義使多個分支重疊

(2)不要忘記最後那個default分支。即使程式真的不需要default處理也應該保留語句default:這樣做並非多此一舉,而是為了防止別人誤以為你忘了default處理。

22.常量

(1)如果不適用常量,直接在程式中填寫數字或字串,將會有什麼麻煩?

1)程式的可讀性變差

2)在程式的很多地方輸入同樣的數字或字串,難保不發生錯誤

3)如果要修改數字或字串,則會在很多地方改動,既麻煩又容易出錯。

(2)盡量使用含義直觀的常量來表示那些將在程式中多次出現的數字或者字串

23.const和#define的比較

(1)const常量有資料型別,而巨集常量沒有資料型別。c++可以對欠著進行型別安全檢查,而對後者只進行字元替換,沒有型別安全檢查,並且字元替換可能會產生意料不到的錯誤

(2)有些整合化的除錯工具可以對const常量進行除錯,但是不能對巨集常量進行除錯。

24.在c++程式中只適用const常量而不適用巨集常量。

25.常量定義規則

(1)需要對外公開的常量放在標頭檔案中,不需要對外公開的常量放在定義檔案的頭部

(2)如果某一常量與其他常量密切相關,應在定義中包含這種關係,而不應給出一些孤立的值。

26.類中的常量

(1)不能在類宣告中初始化const資料成員。

(2)const資料成員的初始化只能在類的建構函式的初始化表中進行

(3)建立類中的恆定常量,用類中的列舉常量來實現

列舉常量不會占用物件的儲存空間,它們在編譯時會被全部求值。列舉常量的缺點是資料型別隱含是整形,其最大值有限,且不能表示浮點數

27.函式設計:引數規則

(1)引數的書寫要完整,不要貪圖省事只寫引數的型別而省略引數名字,如果沒有引數可以用void填充

(2)引數命名要恰當,順序要合理:程式設計師的一般習慣是目的引數在前,源引數在後

(3)如果引數是指標,且僅做輸入用,則應在型別前加const,以防止該指標在函式體內被意外修改

(4)如果輸入引數以值傳遞的方式傳遞物件,則宜改用「const &」方式來傳遞,這樣可以省去臨時物件的構造和析構過程,從而提高效率。

(5)避免函式有太多的引數,引數個數盡量控制在5個以內。

(6)盡量不要使用型別和數目不確定的引數

(7)不要省略返回值的型別

(8)函式名字與返回值型別在語義上不可衝突

(9)不要將正常值和錯誤標誌混在一起返回

(10)有時候函式原本不需要返回值,但為了增加靈活性,可以附加返回值。

(11)如果返回值是乙個物件,有些場合用引用傳遞替換值傳遞可以提高效率。而有些場合只能用值傳遞而不能用引用傳遞。

高質量c 程式設計讀書筆記

高質量c 程式設計讀書筆記 4 3 2 2 2 2 5 5 2 5 2 strcpy函式的原型 assert src null dst null char address dst while dst src 0 null return address 疑問1 相加函式,如果沒有 friend 修飾則...

讀書筆記 高質量C C程式設計指南 目錄

序 最近痛下決心要好好學習下c和c 以為即將來臨的求職做點準備,在網上搜野指標的問題時看到了 高質量c c程式設計指南 對於我這種想從事嵌入式開發的人來說,猶如收穫到一本程式設計的bible似的。此文對c和c 程式設計的風格及注意事項進行了精妙的分析,集合了thinking in c effecti...

高質量C C 程式設計指南讀書筆記(2)

7.2.1用malloc或者new申請記憶體之後,應該立即檢查指標值是否為 null。防止使用指標值為null的記憶體。7.2.3動態記憶體的申請與釋放必須配對,防止記憶體洩漏。7.2.4用free或delete釋放了記憶體之後,立即將指標設定為null,防止 產生 野指標 7.7野指標的成因 1 ...