編碼標準:
- 封裝和隔離。
- 在聲明一個類的時候,應避免暴露出其私有成員。
- 應該使用一個形如“struct Xxxxlmpl *pimpl_”的不透明的指針來存儲私有成員(包括狀態(tài)變量和成員函數)。
使用pimpl(編譯器防火墻)可以大大降低代碼之間的相互依賴性,對于pimpl_需要注意:
- pimpl_中存儲的是私有變量和私有成員函數。
- 一般需要一個反向指針(習慣稱為self_)來調用可見類的函數。
- 即使虛擬函數是私有的,也不能把虛擬成員函數隱藏在pimpl類中。
文章來源:
http://my.donews.com/robinchow/2007/01/13/qwtfsgyamrxaxddpwhxeyatxgntnrlthhnna/
Koenig Lookup:
如果你給函數提供一個 class 類型的實參,那么在名稱搜索時,編譯器將認為包含實參類型的命名空間中的同名函數的可選函數。
接口原則:
對于一個類X,所有的函數,包括自由函數,只要同時滿足
就是X的邏輯組成部分,因為它們組成了X的接口。
接口原則與 Koenig lookup 的行為相同,因為 Koenig lookup 的行為正是建立在接口原則的基礎上的。
小結:
- 接口原則:對于 class X,所有的函數,包括自由函數,只要同時滿足(a)“提及”X,(b)與 X“同期提供”,那么它就是X的邏輯組成部分,因為它們是 X 的接口的一部分。
- 因此,成員和非成員函數都是一個 class 的邏輯組成部分。只不過成員函數比非成員函數有更強的關聯(lián)關系。
- 在接口原則中,對“同期提供”的最有用的解釋是“出現(xiàn)在相同的頭文件和/或命名空間中”。如果函數與 class 出現(xiàn)在相同的頭文件中,在依賴性分析時,它是此 class 的組成部分。如果函數與類出現(xiàn)在相同的命名空間中,在對象引用和名稱搜索時,它是此 class 的組成部分。
文章來源:
http://my.donews.com/robinchow/2007/01/14/tlcchrdcrthuzvbqdhrczbijwughfpwzbybi/
C++ 中的內存區(qū)域分為6塊:
- 常量數據區(qū):存儲字符串等在編譯期間就能確定的值。類對象不能存在與這個區(qū)域中。在程序的整個生存周期內,區(qū)域中的數據都是可用的。區(qū)域內的所有數據都是只讀的,任何企圖修改本區(qū)域數據的行為都會造成無法預料的后果。
- 棧區(qū):存儲自動變量。棧區(qū)中,內存一旦被分配,對象就立即被構造好了;對象一旦被銷毀,分配的內存也立即被收回。
- 自由存儲區(qū):是 C++ 的兩個動態(tài)內存區(qū)域之一,使用 new 和 delete 來予以分配和釋放。
- 堆區(qū):是另一個動態(tài)存儲區(qū)域,使用 malloc、free 以及一些相關變量來進行分配和回收。
- 全局/靜態(tài)區(qū):在程序啟動時才被分配,而且可能直到程序開始執(zhí)行的時候才被初始化。比如,函數中的靜態(tài)變量就是在程序第一次執(zhí)行到定義該變量的代碼時才被初始化的。對那些跨越了編譯單元的全局變量進行初始化操作的順序是沒有被明確定義的,因而需要特別注意管理全局對象(包括靜態(tài)類對象)之間的依賴關系。
另外注意,C++ 標準對于堆和自由存儲區(qū)是否有聯(lián)系沒有予以詳細說明,不同編譯器可能有不同的實現(xiàn)。
文章來源:
http://my.donews.com/robinchow/2007/01/14/kvdartgbqpsrlrmsxjgnplhdrqqyqtkapnag/