條款04 確定物件被使用前已先被初始化

2021-08-05 19:12:13 字數 1357 閱讀 3929

// 條款04: 確定物件被使用前已被初始化

#include #include #include using std::string;

using std::cout;

using std::endl;

using std::list;

class point04 ;

// 1.不要混淆了賦值(assignment)和初始化(initialization)

// c++規定,物件成員變數的初始化動作發生在進入建構函式本體之前。

// 編譯器會為使用者自定義型別的成員變數自動呼叫default建構函式,

// 也就是說在進入abentry建構函式本體時間之前,這些自定義型別的成員得default建構函式

// 已經被呼叫。但是對於內建型別,不能保證一定在賦值動作之前獲得初值。

class phonenumber ;

class abentry ;

// 賦值

// 先呼叫default建構函式,然後呼叫copy assignment操作符

// abentry::abentry(string& name, string& address, listphones)

// 初始化(用成員列表初始化)

// 只用了一次copy建構函式

// 這個做法效率更高,因為初始列中針對各個成員變數設的實參,

// 被拿去作為各成員變數的建構函式的實參,呼叫建構函式時已經對各個變數進行了copy初始化

// 對於內建型別例如本例中的int型別,賦值和初始化成本相同,為了一致性,也在成員列表初始化

// 但是對於內建型別,如果其為const或者reference,那麼它們就不能被賦值,需要初值,所以要用初始化列表

abentry::abentry(string& name, string& address, listphones)

: m_name(name), // 這些都是初始化,建構函式本體不必有任何動作

m_address(address), // m_name以name為初值進行拷貝構造,等等

m_phones(phones),

m_num_consulted(0)

// 2.總是使用成員列表進行初始化,這樣做有時候絕對必要,且往往比賦值更高效

// 3.c++有著十分固定的成員初始化次序,基類更早的初始化,成員變數以其宣告的次序被初始化。

// 4.為內建型別物件進行手工初始化,因為c++不保證初始化它們。

// 5.為免除「跨編譯單元只初始化次序」問題,請以local static物件替換non-local

int main04()

條款04 確定物件被使用前已先被初始化

總結 1.為內建型物件進行手工初始化,因為c 不保證初始化它們。2.建構函式最好使用成員初值列 memberinitialization list 而不要在建構函式本體內使用賦值操作 assignment 初值列列出的成員變數,其排列次序應該和它們在class中的宣告次序相同。3.為免除 跨編譯單元...

條款04 確定物件被使用前已先被初始化

讀取未初始化的值會導致不明確的行為,使程式終止或者行為不可 最佳的處理方法是 永遠在使用物件之前先將它初始化。在初始化時,有以下注意事項 對內建型別,需要手工完成初始化。對其他型別,確保建構函式都將物件的每乙個成員初始化。規定總是在初值列表中列出所有的成員變數,以免需要區分哪些成員變數無需初值。成員...

條款04 確定物件被使用前已先被初始化

最佳的處理方法 永遠在使用物件的之前先將他初始化,對於無任何成員的內建型別,你必須手工完成此時 對於內建型別以外的任何其他東西,初始化責任落在建構函式身上 確保每乙個建構函式都將對物件的每乙個成員初始化。但是別混淆賦值 assignment 和初始化 initialization 內建型別如下 in...