確定物件使用前已經初始化

2021-08-19 09:00:46 字數 1943 閱讀 3877

一、中心內容

1、為內建型別物件進行手工初始化,因為c++不保證初始化他們。

2、建構函式最好使用成員初始列表,而不要在建構函式本體內使用賦值操作。初始列表列出的成員變數,其排列次序應該和它們在class中的宣告次序相同;

3、為免除「跨編譯單元值初始化次序」問題,請以local static物件替換non-local static物件。

二、主要內容

(1)初始化的最佳方式是用初始化列表

e.g

class phponenumber
class abentry

;

//第乙個版本

abentry::abentry(const std::string& name, const std::string& address, const std::list& phones)

//第二個版本
abentry::abentry(const std::string& name, const std::string& address, const std::list& phones)

:thename(name), theaddress(address), thephones(phones), num(0)

{}

note:

1)後者的效率通常比前者的較高,雖然結果一樣。。。關鍵是:前者得事先呼叫成員變數的各個建構函式進行預設初始化,然後在賦予乙個新值;而後者則直接呼叫建構函式,用給定的實參進行初始化!!!

2)然而對於內建型別來說,兩種方法是一樣的,即初始化和賦值的成本是一樣的,因為其沒有預設建構函式。。。但是也要將內建型別的成員變數列在列表中,所有的成員變數都得列入初始化列表中,以免引起不必要的錯誤;

3)總是使用列表初始化。(const和引用變數一定需要初值,而不能進行賦值)

4)由於乙個類內可能有多個初始值列表,所以會產生一些重複的賦值工作。。。為解決這個問題,經常將那些「賦值和初始化一樣成本」的成員變數在private裡就進行初始化

5)初始化順序按照宣告的次序。

二、盡量用local static代替non-local static

(1)static物件包括兩種:local物件,定義於函式內;non-local物件,定義於namespace作用域內、classes內或global物件。

(2)編譯單元

指產出單一目標檔案的單一原始碼檔案+所含入的標頭檔案。

note:

key問題:某編譯單元的某個non-local static物件的初始化動作使用了另乙個編譯單元內的某個non-local static物件,它所用到的這個物件可能尚未被初始化,因為c++對「定義於不同編譯單元內的non-local static物件」的初始化次序麼有明確定義

e.g

class filesystem ;

extern filesystem tfs;

/*改為:

filesystem& tfs()

*/class directory ;

directory::directory(int params)

/*改為:

directory& temdir()

*/directory tempdir(int params);

關於extern,見:

說明:上述**中,temdir的建構函式可能會用到尚未初始化的tfs,但是temdir和tfs是定義於不同編譯單元內的non-local static,初始化順序無明確定義,會造成錯誤。

為了解決這個問題,做出以下改變:

基礎:c++保證,函式內的local static物件會在「該函式被呼叫期間」「首次遇上該物件的定義式」時被初始化。

(1)確定物件被使用前已經被初始化

在物件使用之前將它初始化,對於無任何成員的內建型別,你必須手工完成此事。例如 int x 0 const char text double d std cin d 以input stream 的方式完成初始化 內建型別以外的任何其他東西,初始化責任落在建構函式身上。確保每乙個建構函式都將物件的每乙個...

Item 4 確定物件使用前已經被初始化

目錄 一.建構函式 二.成員初值列表 三.不同編譯單元的non local static 物件的初始化 一.建構函式 在c和 c 中,一些內建型別 其實也就是c 繼承c的內容 是預設不被自動初始化的,如int double 等等,但在我的gcc 上,int 被預設初始化為0,char 被預設不輸出,...

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

讀取未初始化的值會造成不明確的行為。例如下面這個建構函式 abentity abentity const std string name,const std string address,const std list phones thename name theaddress address th...