高質量c c 程式設計

2021-09-30 04:38:22 字數 3518 閱讀 4034

第1章

為防止標頭檔案被重複引用,應當用 ifndef/define/endif 結構產生預處理塊

使用 #include引用標準庫標頭檔案,使用 #include"filename.h" 引用非標準庫標頭檔案

標頭檔案中只存放「宣告」,不存放「定義」

第2章

應在關聯性不強的語句間新增空行

一行**只做一件事情

if、for、while、do 等語句自佔一行,且必須帶上 {}

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

關鍵字後面要新增空格,函式明後不留空格

for (int i = 0; i < 10; ++ i)

int sum(int i)

修飾符 * 和 & 應緊靠變數名

第3章

程式中不要出現僅靠大小寫區分的相似的識別符號,不要出現識別符號相同的區域性變數和全域性變數

類名和函式名用大寫字母開頭的單詞組合,變數和引數用小寫字母開頭的單詞組合,常量全用大寫字母,並用下劃線分割單詞

靜態變數前加 s_,全域性變數前加 g_,類的資料成員加 m_

第4章

為防止產生歧義並提高可讀性,應當使用括號來確定表示式的操作順序

與零值比較時,布林變數使用 if (flag)、整型變數使用 if (1 == num)、浮點型變數使用 if (x >= -eps && x <= eps)、指標變數使用 if (null == p)

在多重迴圈中,如果有可能,應當最長的迴圈放在最內層,已減少cpu跨切迴圈的次數

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

不要遺漏了 switch 語句中的每個 case 語句後面的 break,不要遺漏 default 語句

第5章

用 const 常量完全取代巨集常量

如果某一常量與其他常量密切相關,應在定義中包含這種關係

const float radius = 100;

const float diameter = radius * 2;

類中的常量應使用列舉常量來實現,但要注意 enum 只能代表整數

第6章

函式的引數名要恰當,順序要合理

如果函式引數是指標,且僅作輸入用,應在型別前加上 const 以防止被無意修改

如果輸入引數以值傳遞方式傳遞物件,則應用"const &"方式以省去臨時物件的構造和析構過程

若函式沒有引數,用void填充

若函式沒有返回值,應宣告為 bool 型別,並在函式體結尾 return true;

正常值用輸出引數獲得,而錯誤標誌用 return 語句返回

在函式體的「入口處」,在必要時候要使用斷言 assert 對引數的有效性進行檢查

在函式體的「出口處」,要對 return 語句的正確性和效率進行檢查,不可返回指向「棧記憶體」的指標或引用

函式功能要單一,不可帶有「記憶」功能

函式的引數該用指標還是引用,要看函式對此引數的具體需求,「用適當的工具做恰如其分的工作」

第7章

記憶體分配的方式:

1.靜態儲存區域分配,全域性變數,static變數

2.棧,區域性變數

3.堆,使用 malloc 或 new 申請的記憶體

使用了 malloc 或 new 後應該立即檢查指標是否為 null

不要忘記為陣列和動態記憶體賦初值

避免陣列或指標的下標越界,特別當心「多1」或「少1」的情況

動態記憶體的申請和釋放必須配對,防止記憶體洩露

使用 free 或 delete 釋放記憶體後,應立即將指標置為 null,防止產生迷途指標

c/c++語言無法知道指標所指的記憶體容量,必須在申請記憶體時記住它

當陣列作為函式的引數進行傳遞時,該陣列自動退化為同型別的指標

不能使用指標引數來申請記憶體,只能使用「指向指標的指標」引數申請記憶體,可以使用返回指標型別的函式申請記憶體

c++**

char*getstring(void)   

char *getstring(void)

malloc/free 是標準庫函式,new/delete 是運算子,malloc/free 無法動態建立自定義類型別物件,保留 malloc/free 主要是為了和 c 相容

記憶體耗盡時(無法申請到記憶體),應馬上使用 exit(1) 終止程式

若指標 p 非空,連續對 p 使用兩次 free 會導致程式崩潰

用 delete 釋放物件陣列時要加上

第8章

當心隱式型別轉換導致過載函式產生二義性

如果派生類的函式與基類的函式同名,但引數不同,此時,無論有無 virtual 關鍵字,基類的函式都將被隱藏

如果派生類的函式與基類的函式同名,且引數相同,但基類函式沒有 virtual 關鍵字,基類的函式被隱藏

引數的預設值只能出現在函式的宣告中,而不能出現在函式的定義體中,不合理地使用引數預設值將可能導致過載函式的二義性

inline不應該出現在內聯函式的宣告中,但必須出現在內聯函式的定義中,應使用內聯函式取代巨集

第9章

對於任意的類,系統將自動為其產生建構函式、拷貝建構函式、析構函式和賦值函式,這四個函式最好自己定義,例如a a = b,a會自動呼叫拷貝建構函式,若a的建構函式中存在動態開闢記憶體的操作,則開闢記憶體的指標會在拷貝的時候複製,可是僅僅複製了指標的位址,但沒有再次動態地開闢一次記憶體,這樣a和b都存在乙個指向同一空間的指標,當他們呼叫析構函式的時候,該記憶體空間就會被釋放兩次而產生錯誤,這種沒有把記憶體資源拷貝多乙份的現象稱為「淺拷貝」

const常量只能在建構函式的初始化列表裡被初始化

成員在初始化列表中的初始化順序只由成員物件在類中宣告的次序決定

拷貝建構函式可以呼叫本類的私有成員

c++**

string::string(conststring &other)   

string::string(const string &other)

賦值函式

c++**

string & string::operate =(conststring &other)   

string & string::operate =(const string &other)

為了防止記憶體洩露,析構函式必須為虛函式

派生類的建構函式必須在其初始化列表中呼叫基類的建構函式

編寫派生類的賦值函式時,要記得對基類的資料成員重新賦值

第10章

只有在邏輯上b是a的「一種」,且a的所有功能和屬性對b都有意義,才允許b繼承a的功能和屬性

第11章

多使用 const 提高函式的健壯性

小心資料型別發生隱式轉換

避免編寫技巧性很高的**

不要設計面面俱到、非常靈活的資料結構

盡量使用標準庫,不要「發明」已經存在的庫函式

盡量不要使用與具體硬體或軟體環境關係密切的變數

高質量程式設計C C

一 請填寫bool float,指標變數與 零值 比較的 if 語句。10 分 請寫出 bool flag 與 零值 比較的 if 語句。3 分 標準答案 if flag if flag 如下寫法均屬不良風格,不得分。if flag true if flag 1 if flag false if f...

高質量c c 程式設計 5

第5章 常量 常量是一種識別符號,它的值在執行期間恆定不變。c語言用 define來定義常量 稱為巨集常量 c 語言除了 define外還可以用const來定義常量 稱為const常量 5.1 為什麼需要常量 如果不使用常量,直接在程式中填寫數字或字串,將會有什麼麻煩?1 程式的可讀性 可理解性 變...

高質量C C程式設計指南

1.如果引數是指標,且僅作輸入用,則應在型別前加const,以防止該指標在函式體內被意外修改 2.在函式體的 入口處 對引數的有效性進行檢查 在函式體的 出口處 對return語句的正確性和效率進行檢查 3.引用的一些規則如下 1 引用被建立的同時必須被初始化 指標則可以在任何時候被初始化 2 不能...