保持習慣,繼續寫部落格。
條款04:確定物件被使用前已被初始化
c++未初始化的值會導致不明確的行為。
c++初始化採用成員初值列的做法比較高效。
class abentry
abentry::abentry()
:thename(),
theaddress(),
thephones(),
numtimesconsulted(0)
{}
成員初始化次序:base classes 更早於其derived classes 被初始化,而class 的成員變數總是以其宣告次序被初始化。所以改變成員初值列的順序也不會改變其初始化的次序。
跨編譯單元之初始化次序的問題:如果有至少2個原始碼檔案,可以採用local static 來代替non-local static 物件
不可以的**:
class filesystem ;
extern filesystem tfs; //預備給客戶使用的物件,tfs 代表「the file system」
class directory;
directory::directory(params)
directory temdir(params); //為臨時檔案而做出的目錄
這樣可能在temdir 初始化的時候tfs還未初始化。
local static做法:
class filesystem; //同前
filesystem& tfs() //這個函式用來替換tfs物件,它在filesystem class 中可能是個staitc
class directory; //同前
directory::directory(params) //同前,但原本的reference to tfs 現在改為tfs()
directory &tempdir() //這個函式用來替換tempdir物件
請記住:
為內建型物件進行手工初始化,因為c++不保證初始化它們。
建構函式最好使用成員初值列,而不要在建構函式本體內使用賦值操作。初值列列出的成員變數,其排序次序應該和它們在class 中的宣告次序相同。
為免除「跨編譯單元之初始化次序」問題,請以local static 物件替換 non-local static 物件。
《effective C 》讀書筆記
1,c 關鍵字explicit c 中,乙個引數的 建構函式 或者除了第乙個引數外其餘引數都有預設值的多參建構函式 承擔了兩個角色。1 是個 構造器,2 是個預設且隱含的型別轉換操作符 所以,有時候在我們寫下如 aaa 這樣的 且恰好 的型別正好是aaa單引數構造器的引數型別,這時候 編譯器就自動呼...
Effective C 讀書筆記
一 讓自己習慣c 1 條款01 視c 為聯邦語言 c 的組成可分為四部分 1.c c 仍然以c語言為基礎。區塊 語句 預處理 內建資料型別 陣列 指標等都來自c。2.object oriented c c with classes所訴說的 classes 包括構造和析構 封裝 繼承 多型 virtu...
讀書筆記 Effective C
部分條款過於深奧,部分條款已了然於心,僅記錄當下所識所學 對於常量巨集定義,最好用const代替 define 對於函式巨集定義,最好用inline代替 define include ifdef ifndef仍被需要 內建物件記得手動初始化 使用成員初始列替換賦值操作 以local static替換...