規則: ①內建型別,必須手工完成初始化。 int x=0; const char* p_text="a c-style string";
②內建型別以外的其他東西,在建構函式內初始化:確保每乙個建構函式都將物件的每乙個成員初始化。但要分清賦值和初始化:
下面的例子是賦值,不是初始化:
class phonenumber ;
class abentry ;
abentry: :abentry(const std: :string& nane , const std: : string& address,
const std::list& phones)
thename = narne; //這些都是賦值(assignments) ,
theaddress = address; //不是始化(initializations)。
thephones = phones;
numtimesconsulted = 0;
int num timesconsulted;
}
正確高效的初始化物件的方法是使用 成員初值列(初始化成員列表):
abentry: :abentry(const std: :string& nane , const std: : string& address,
const std::list& phones)
: thename(name),
theaddress(address), //這些都是初始化
thephones(phones),
numtimesconsulted(0)
{} // 建構函式體是空的
原因:第一種是先呼叫成員變數的預設建構函式構造成員變數,然後呼叫賦值操作符(operator)。
第二種方法直接拿引數呼叫copy建構函式程序初始化。第二種效率比第一種要高。
準則:規定總是在初值列中列出所有的成員變數,以免還記住哪些成員變數可以無需初值列。
如果成員變數是const或reference,他們就一定需要初值,不能被賦值。
規定:總是用成員初值列
①c++成員初始化順序:base classes 更早與derived classes被初始化。class 成員變數的初始化順序按照宣告順序非初值列順序。
②兩個原始檔,每乙個內含有乙個non-local static物件。如果乙個原始碼的non-local static呼叫另乙個原始碼的non-local static ,而且被呼叫的未初始化,這時候就會出問題。
第乙個原始檔:
class filesystem ;
extern filesystem tfs;
第二個原始檔:
class directory ;
directory::directory( params )
建立乙個directory 物件
directory tempdir( params );
除非tfs在tempdir前被初始化,但是tfs和tempdir是不同人在不同的時間用於不同的原始碼檔案建立起來的,是定義於不同編譯單元內的non-local static物件。c++對此類的初始化次序沒有明確的定義。
採用如下方法:
方法:將每個 non-local static物件搬到自己的專屬函式內(該物件在此函式被宣告為static)。函式返回乙個引用指向它所含的物件,使用者直接呼叫這些函式而不是直接涉及到這些物件。 non-local static物件被 local static物件替換了。
class filesystem ;
filesystem& tfs()
class directory ;
directory::directory( params )
directory& tempdir()
directory tempdir( params );
這樣,在建立tempdir過程中,會呼叫tfs()。保證了物件初始化順序。
請記住:
1為內建物件手工初始化
2建構函式使用初始化列表,順序與宣告次序相同
3,跨編譯單元初始化問題 用local static 物件 替換 non-local static脆響。方法:
為每乙個non-local static物件建立乙個 reference-returning 函式。
條款04 確定物件被使用前已被初始化
記住 永遠在使用物件前先將它初始化。1 不要混淆賦值assignment和初始化initialization。abentry abentry const std string name,const std string address,const std list phones 版本1 abentr...
4 確定物件在使用前已被初始化
一 盡量使用成員初始化的方式初始化成員 c 規定成員初始化發生早於建構函式,建構函式最好使用成員初值列,而不要在建構函式中使用賦值操作。初值列中的成員變數的初始化順序是根據這些成員變數宣告的順序進行初始化的,所以為了保證一致性,成員初值列中的順序最好跟宣告順序一致。二 為避免 跨編譯單元的初始化先後...
條款4 確認物件在被使用前已被初始化
1。最佳的處理方式是 永遠在使用物件之前先將它初始化。對於無任何成員的內建型別,你必須手動完成此事。至於內建型別以外的任何其他東西,初始化的責任落在建構函式身上 確保每乙個建構函式都將物件的每乙個成員初始化。但是別混淆了賦值喝初始化。2.建構函式的乙個較佳寫法是,使用所謂的member initia...