讀取未初始化的值會造成不明確的行為。
例如下面這個建構函式:
abentity::abentity(const std::string& name, const std::string& address,
const std::list& phones)
thename = name;
theaddress = address;
thephones = phones;
注意這是我們新手比較容易犯的乙個錯誤,我們以為上面這個建構函式對成員進行了初始化。其實,這不是初始化,這是賦值。雖然abentity可以得到你期望的值。
c++規定初始化的動作發生在進行建構函式本體之前。
比較好的乙個做法是使用成員初始化列表:
abentity::abentity(const std::string& name, const std::string& address,
const std::list& phones)
: thename(name),
theaddress(address),
thephones(phones){}
基於賦值的那個版本,首先呼叫default建構函式為thename,theaddress,thephones設初始值,然後,在函式體內再進行賦值。所以說default建構函式所做的一切都沒有用。
而基於成員初始值列表的做法是直接呼叫thename,theaddress,thephones的copy建構函式。
對於大多數而言,第二種方式每個成員只呼叫一次copy建構函式的方式高效的多。而對於內建型別來說,採用成員初始化列表與在建構函式內進行賦值的代價是一樣的,但為了統一,也把內建型別的初始化放在成員初始化列表。
問為什麼內建型別的初始化,兩種方式一樣?
初始化是兩個過程:記憶體分配,填寫值。
對於第一種方式,在函式體內進行賦值,是先記憶體分配,再賦值。對於在成員初始化列表中初始化也是先分配記憶體,再賦值。兩種作法的步驟都一樣。
而類成員,第一種方式會導致呼叫預設建構函式無用功。
條款04 確定物件被使用前已被初始化
記住 永遠在使用物件前先將它初始化。1 不要混淆賦值assignment和初始化initialization。abentry abentry const std string name,const std string address,const std list phones 版本1 abentr...
條款04 確定物件被使用前已先被初始化
總結 1.為內建型物件進行手工初始化,因為c 不保證初始化它們。2.建構函式最好使用成員初值列 memberinitialization list 而不要在建構函式本體內使用賦值操作 assignment 初值列列出的成員變數,其排列次序應該和它們在class中的宣告次序相同。3.為免除 跨編譯單元...
條款04 確定物件被使用前已先被初始化
讀取未初始化的值會導致不明確的行為,使程式終止或者行為不可 最佳的處理方法是 永遠在使用物件之前先將它初始化。在初始化時,有以下注意事項 對內建型別,需要手工完成初始化。對其他型別,確保建構函式都將物件的每乙個成員初始化。規定總是在初值列表中列出所有的成員變數,以免需要區分哪些成員變數無需初值。成員...