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

2021-08-02 11:55:02 字數 1431 閱讀 4337

讀取未初始化的值會導致不明確的行為,使程式終止或者行為不可**。最佳的處理方法是:永遠在使用物件之前先將它初始化。

在初始化時,有以下注意事項:

對內建型別,需要手工完成初始化。

對其他型別,確保建構函式都將物件的每乙個成員初始化。

規定總是在初值列表中列出所有的成員變數,以免需要區分哪些成員變數無需初值。

成員初始化次序,基類早於派生類被初始化,成員變數總是以其宣告次序被初始化。

class student;

//賦值

student::student(string name, string address)

//初始化

student::student(string name, string address)

:m_name(name),m_address(address),m_age(0)

c++規定,成員變數的初始化發生在進入建構函式之前。在建構函式內,m_name,m_address都不是被初始化,而是被賦值。賦值的版本先呼叫default建構函式為m_name,m_address設初值,然後在對它們賦新值,效率較低。

static物件,生命週期從被構造出來到程式結束為止,包括:

global物件,

定義於namespace作用域內的物件,

在class內、在函式內、在file作用域內被宣告為static的物件。

其中函式內的static物件成為local static,其它static物件成為non-local static物件。

編譯單元,指產出單一目標檔案的原始碼,基本上它是單一原始碼檔案加上其所含入的標頭檔案。c++對「定義於不同的編譯單元內的non-local static物件」的初始化相對次序並無明確定義。如果某個編譯單元內的 non-local static物件的初始化使用了另乙個編譯單元中的non-local static物件,而該物件尚未初始化,就會出現錯誤。

解決問題的方法是:將每個non-local static物件搬到自己的專屬函式內(該物件在函式內宣告為static),函式返回乙個reference指向它所含的物件。此時,non-local static物件被local static 物件替換了。

這種方法可行的原因是:函式內 local static物件會在「該函式被呼叫期間」初始化。所以以「函式呼叫」(返回指向 local static物件的引用)替換「直接訪問 non-local static物件」,就能保證引用了經過初始化的物件。

student& getstudent()

內建型物件手工初始化,因為c++不保證初始化它們。

建構函式最好使用初始值列表,而不是在建構函式體內賦值操作。初始值列表中變數次序應該與類中宣告的次序相同。

避免「跨編譯單元初始化次序」問題,以local static物件替換non-local static 物件。

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

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

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

條款04 確定物件被使用前已被初始化 include include include using std string using std cout using std endl using std list class point04 1.不要混淆了賦值 assignment 和初始化 initi...

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

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