永遠(yuǎn)不要用#include包含不必要的頭文件
如果只需要流的前置聲明,應(yīng)該優(yōu)先使用#include<iosfwd>
只需要前置聲明時(shí),絕不要用#include包含相應(yīng)的頭文件。
如果使用聚合關(guān)系就已經(jīng)足夠,就不要使用繼承。
要避免使用內(nèi)聯(lián)或者復(fù)雜的調(diào)整方法,除非通過性能分析證明這確實(shí)是必要的。
正確使用名字空間。如果將一個(gè)類放入名字空間,那么同時(shí)要保證將這個(gè)類的所有輔助函數(shù)和運(yùn)算符函數(shù)也放入相同的名字空間。否則,你將在代碼中發(fā)現(xiàn)奇怪的結(jié)果。
存區(qū)域.jpg)
要理解這五種不同類型的內(nèi)存,了解他們?yōu)槭裁词遣煌模约八麄兏髯缘男袨橛质窃趺礃樱簵#ㄗ詣?dòng)變量)、自由存儲(chǔ)(new/delete)、堆(malloc/free)、全局(靜態(tài)變量、全局變量、文件作用域變量等)、常量數(shù)據(jù)(字符串常量等)。
優(yōu)先使用自由存儲(chǔ)(new/delete),避免使用堆(malloc/free)。
對(duì)于“堆”和“自由存儲(chǔ)”進(jìn)行區(qū)分,這一點(diǎn)很重要,因?yàn)樵贑++標(biāo)準(zhǔn)中有意避開了這兩種類型的內(nèi)存是不是相關(guān)的這個(gè)問題。例如,當(dāng)通過::operator delete()函數(shù)來釋放內(nèi)存時(shí),在C++標(biāo)準(zhǔn)的18.4.1.1中,最后一項(xiàng)是這樣的:
“ 在C++標(biāo)準(zhǔn)中并沒有規(guī)定,在哪些情況下,在通過operator delete回收的存儲(chǔ)空間中,有一部分或者全部的控件可以再隨后調(diào)用operator new或者calloc,malloc以及realloc等函數(shù)時(shí)被重新分配,這些函數(shù)的聲明時(shí)在<cstdlib>中。”
而且,在C++標(biāo)準(zhǔn)中也沒有規(guī)定,new/delete是否需要通過malloc/free來實(shí)現(xiàn)。不過,在C++標(biāo)準(zhǔn)20.4.6節(jié)的第3段和第4段中規(guī)定了,malloc/free一定不能使用new/delete來實(shí)現(xiàn):“calloc、malloc和realloc函數(shù)不會(huì)通過調(diào)用::operator new()來分配存儲(chǔ)空間。函數(shù)free()不會(huì)通過調(diào)用::operator delete() 來釋放內(nèi)存。”
如果在類中定義了new和delete中的任意一個(gè)運(yùn)算符函數(shù),那么一定要同時(shí)定義另外一個(gè)。
通常應(yīng)該顯式地將函數(shù)operator new ()和operator delete()聲明為靜態(tài)函數(shù)。他們永遠(yuǎn)都不能使非靜態(tài)成員函數(shù)。
永遠(yuǎn)都不要通過多態(tài)的方式處理數(shù)組。
優(yōu)先選擇使用vector或者deque,而不是數(shù)組。
在編寫拷貝賦值運(yùn)算符函數(shù)時(shí),永遠(yuǎn)都不要指望能夠通過對(duì)自我賦值進(jìn)行檢測(cè)來保證函數(shù)的正確性;應(yīng)該在拷貝賦值運(yùn)算符函數(shù)中使用“創(chuàng)建臨時(shí)對(duì)象并進(jìn)行交換”的慣用法,這種方法不僅是異常安全的,而且在處理自我賦值時(shí)也是安全的。
可以將自我賦值檢測(cè)作為一種優(yōu)化手段,以避免不必要的工作,這是正確地做法。
不僅要避免編寫類型轉(zhuǎn)換運(yùn)算符函數(shù),而且還要避免編寫隱式的構(gòu)造函數(shù)。
盡量編寫異常安全的代碼。在編寫代碼時(shí)應(yīng)該始終遵循:即使在出現(xiàn)異常時(shí),資源仍然能夠被正確地釋放,并且數(shù)據(jù)也總是處于一致的狀態(tài)。
避免使用語言中那些不常用的特性,而應(yīng)該使用最簡(jiǎn)單并且有效的技術(shù)。
拷貝初始化過程絕不是賦值過程,因此在初始化中永遠(yuǎn)都不會(huì)調(diào)用函數(shù)T::operator=()。是的,我知道在初始化語句中有一個(gè)“=”符合,但不要被它迷惑。它只是從C語言中沿用過來的一種語法,并不代表賦值運(yùn)算。
如果可能的話,優(yōu)先使用“T t(u);”這種形式,而不是“T t=u;”的形式。通常,能能夠時(shí)候后者的地方,都可以使用前者,并且使用前者還有更多的好處——例如,可以帶多個(gè)參數(shù)。
在函數(shù)聲明中,如果參數(shù)是以傳值方式來傳遞的,則不要使用const。而如果在這個(gè)函數(shù)的定義中,參數(shù)是不能被修改的,那么應(yīng)該使用const。
對(duì)于不是內(nèi)置類型的返回值來說,當(dāng)使用返回值的方式而不是返回引用的方式時(shí),應(yīng)該優(yōu)先選擇返回const值。
const 和mutable都是你的朋友
優(yōu)先使用新形式的類型轉(zhuǎn)換。
不要通過類型轉(zhuǎn)換去掉常量屬性,而應(yīng)該使用mutable。
避免使用向下的類型轉(zhuǎn)換。
優(yōu)先通過引用方式來傳遞對(duì)象參數(shù),而不是傳值方式,并且在所有可能的地方都使用const。
避免使用內(nèi)聯(lián),除非從性能的分析上來看確實(shí)有必要這么做。
避免使用全局變量或者靜態(tài)變量。如果必須使用,那么一定要特別注意這些變量的初始化順序。
在構(gòu)造函數(shù)的初始化列表中,應(yīng)該把 基類按照他們?cè)陬惗x中出現(xiàn)的先后順序進(jìn)行排列。
在編寫代碼時(shí),永遠(yuǎn)都不應(yīng)該依賴函數(shù)參數(shù)的求值順序