C++ Initialization

C++ 對內建 type(如 int)要手動做 initial。

class member 的初始化

以 constructor 的 member initialization list 做 member 的初始化,會直接將參數丟給該 member 相對應的 constructor,可避免先 run member 的 default constructor 後才再做 assign,效率較好。

member 初始化順序:

  1. base class -> derived class
  2. 依宣告次序初始化(宣告次序與 member initialization list 的次序可能不同)

初始化 member 的原則:將所有 member 依照宣告順序列在 member initialization list 中。

non-local static object 的初始化

C++ 未定義在不同 translation unit((產生單一 object file 的 source code))中的 non-local static objects((不在 function 中的 static object,如 global object))的初始化相對次序。

這會造成一些問題,例如在 source code A 裡的 global object objA 的初始化會用到在 source code B 裡的 global object objB 時可能有問題,因為不知道 objA 是不是會比 objB 晚初始化。

解法:把 non-local static object 放到一 function 中,讓它不是 non-local,則可以知道初始化的順序。該 function return object 的 reference,要用這類 object 時就 call 相應 function。

Ref

  • 《Effective C++》p.27~28, 31