c 確定物件被使用前已先被初始化

2022-08-10 17:21:14 字數 1670 閱讀 9278

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...