1 對於內建型物件來說,應該進行手工初始化,因為c++不保證初始化他們。
2 建構函式最好使用成員初始值(member initialization list),而不是要在建構函式本體內使用賦值操作。初始列列出的成員變數,
其排列次序應該是和它們在class中的生命次序相同。
class aaa
public:
int a;
float b;
std::string c;
aaa(int a1, float b1, const std::string& name);
aaa::aaa(int a1, float b1, const std::string& name ):a(a1), b(b1), c(name){} // 應該用用成員初始值初始化,效率高, 對於c來說只是呼叫了一次copy 建構函式
aaa::aaa(int a1, float b1,const std::string& name) // 不要用這種在建構函式內賦值的方法
a = a1;
b = b1;
c = name; // 對於c來說,先呼叫了一次default的建構函式(完全浪費了),然後再呼叫一次copy assignment來賦值。
3 為免除「跨編譯單元之初始化次序」問題,請以local static 物件替換non-local static 物件
對於不是在函式內定義的non-local static物件來說,c++對於「不同編譯單元內」的non-local static 物件的初始化並沒有定義。
所以如果某個non-local static物件a的初始化動作使用了另乙個編譯單元內的某個non-local static物件,則它使用到的這個物件可能尚未被初始化。
解決的方法就是用local static來進行替換。因為c++保證:對於函式內的local static物件會在「該函式被呼叫期間」 「首次遇上該物件之定義式」時被
初始化。
example 1: 使用non-local static物件
/// file1
class filesystem
public:
std::size_t numdisks() const;
extern filesystem tfs;
/// file2
class directory
public:
directory(params);
directory::directory(params)
std::size_t disks = tfs.numdisks(); // 使用tfs物件。假如tfs還沒有被初始化,那麼這裡就會出錯。
example 2: 使用local static 物件來代替
/// file1
class filesystem ; // 同上
filesystem& tfs()
static filesystem tfs;
return tfs;
/// file2
class directory; // 同上
directory::directory(params)
std::size_t disks = tfs().numdisks(); // 使用tfs() ,這樣就可以保證在使用tfs前其已經初始化
條款04 確定物件被使用前已先被初始化
總結 1.為內建型物件進行手工初始化,因為c 不保證初始化它們。2.建構函式最好使用成員初值列 memberinitialization list 而不要在建構函式本體內使用賦值操作 assignment 初值列列出的成員變數,其排列次序應該和它們在class中的宣告次序相同。3.為免除 跨編譯單元...
條款04 確定物件被使用前已先被初始化
讀取未初始化的值會導致不明確的行為,使程式終止或者行為不可 最佳的處理方法是 永遠在使用物件之前先將它初始化。在初始化時,有以下注意事項 對內建型別,需要手工完成初始化。對其他型別,確保建構函式都將物件的每乙個成員初始化。規定總是在初值列表中列出所有的成員變數,以免需要區分哪些成員變數無需初值。成員...
條款04 確定物件被使用前已先被初始化
條款04 確定物件被使用前已被初始化 include include include using std string using std cout using std endl using std list class point04 1.不要混淆了賦值 assignment 和初始化 initi...