進入第四條準則:
Make sure that objects are initialized before they're used
C++中的物件是否會自動被初始化呢?答案是有些有,有些沒有。如第一條規則([Day 2] View C++ as a federation of languages)說的,C++是個語言熔爐,所以會發現為什麼有些時候有些物件需要去初始化他有些不用,例如array(C++中的C part)就不需要,但vector(C++中的STL part)就要。因為太複雜了所以只要掌握這個大原則就好─ 在使用物件之前先初始化它!
對於內建的非成員物件,我們需要特別寫,例如:
int x=0;
const char* test = "A C-style string";
double d;
std::cin>>d;
而對於其他的物件,通常都是在constructors完成。這裡也有簡單原則:確保constructor裡面有將所有物件成員初始化!
值得注意的一點是,知道要在constructor初始化,可能很直覺的寫法就是這樣寫:
ABEntry::ABEntry(const std::string& name, const std::string& address, const std::list<PhoneNumber>& phones)
{
theName = name;
theAddress = address;
the Phones = phones;
}
但這樣寫還不夠好,在進入constructor的本體之前,這些成員就都被初始化好了!目前的寫法其實是assignment,default的constructor會在進入constructor的本體之前就先初始化好了─除了numTimesConsuslted
因為它是build-in type。
更好的寫法是用 "member initialization list"
ABEntry::ABEntry(const std::string& name, const std::string& address, const std::list<PhoneNumber>& phones):
theName(name), theAddress(address), thePhones(phones){}
雖然兩者呈現的結果相同,但後者比前者來得有效率。因為前者其實會先call default constructors先初始化好後,再重新assign新的值給那幾個變數。而使用initialization list則是直接在construct的時候採用copy construct。通常形態下,效率:call一個copy constructor
> 先default constructor
再+ copy assigment
有時我們非要用member initialization list不可,例如當data member是const或是reference的時候,因為它們不能被assign,因此永遠都要用initialization list。
另外一個反例則是當我們有多組constructor的時候,例如繼承的classes,每一層都有自己的一組初始化list,這時就可以考慮把assignments放到一個function讓各個constructor來call。不過大部分時間,使用initialzation list會比較推薦。