“確定對象的使用前被初始化“毫無疑問這和C++的構造函數有關,對內置類型來說在使用前確保被初始化的最好方式就是在定義一個變量的時候給他一個初始值。而對於自定義類型莫過於類的構造函數了,這相對與C來說的話優雅了很多。
其中將類的成員變量的列表初始化和函數體內初始化,在講到一下版本的構造函數時個人覺得有點不妥
ABEntry::ABEntry(const std::string& name, const std::string& address,
const std::list<PhoneNumber>& phones)
{
theName = name;
theAddress = address;
thePhones = phones;
numTimesConsulted = 0;
}在書上提到使用上面的賦值版本的構造函數的時候,首先會調用default構造函數為類的成員進行初始化然後再對他們賦予新值。這樣的解釋個人覺得又一下幾個疑問:
1. default構造函數何時調用?
2.為什麼在調用default構造函數後還會調用自己寫的構造函數?
3. 由誰觸發了自己寫的構造函數的調用?
相比於先調用default構造函數初始化然後在進行賦值,個人覺得一下的這種解釋更可靠一點:在調用賦值版本的構造函數時首先檢查函數有沒有初始化列表,如果有初始化列表則按照初始化列表中的值進行初始化,如果沒有初始化列表,則使用各個成員變量的默認構造函數對自己進行初始化。而後在函數體中調用賦值運算符重載函數進行賦值操作。
上述的初始化方式肯定不是推薦的,因為,這樣的構造函數相比與初始化列表方式的構造函數多調用了一個賦值運算符的重載函數。按照性能來說的話這是沒有必要的。所以說盡量還是使用初始化列表的方式。