1. 程式人生 > >使用初始化列表的好處

使用初始化列表的好處

pre 復雜 operator emp 高效率 brush pri 即使 模板

1.類成員中存在常量,如const int a,只能用初始化不能復制

2.類成員中存在引用,同樣只能使用初始化不能賦值。

3.提高效率

關於提高效率在《Effective C++》條款12 盡量使用初始化而不要在構造函數裏賦值,是這樣說的:

template<class T>
class NamedPtr {
public:
	NamedPtr(const string& initName, T *initPtr);
	...
private:
	const string& name; // 必須通過成員初始化列表
						// 進行初始化
	T * const ptr; // 必須通過成員初始化列表
				   // 進行初始化
};

  前面最初的類模板不包含 const 和引用成員。即使這樣,用成員初始化列表還是比在構造函數裏賦值要好。這次的原因在於效率。當使用成員初始化列表時,只有一個 string 成員函數被調用。而在構造函數裏賦值時,將有兩個被調用。為了理解為什麽,請看在聲明 NamedPtr<T>對象時都發生了些什麽。

對象的創建分兩步:
1. 數據成員初始化。
2. 執行被調用構造函數體內的動作。

(對有基類的對象來說,基類的成員初始化和構造函數體的執行發生在派生類的成員初始化和構造函數體的執行之前)

對 NamedPtr 類來說,這意味著 string 對象 name 的構造函數總是在程序執行到 NamedPtr 的構造函數體之前就已經被調用了。問題只在於:string 的哪個構造函數會被調用?

這取決於 NamedPtr 類的成員初始化列表。如果沒有為 name 指定初始化參數,string 的缺省構造函數會被調用。當在 NamedPtr 的構造函數裏對 name執行賦值時,會對 name 調用 operator=函數。這樣總共有兩次對 string 的成員函數的調用:一次是缺省構造函數,另一次是賦值。相反,如果用一個成員初始化列表來指定 name 必須用 initName 來初始化,name 就會通過拷貝構造函數以僅一個函數調用的代價被初始化。即使是一個很簡單的 string 類型,不必要的函數調用也會造成很高的代價。隨著類越來越大,越來越復雜,它們的構造函數也越來越大而復雜,那麽對象創建的代價也越來越高。養成盡可能使用成員初始化列表的習慣,不但可以滿足 const 和引用成員初始化的要求,還可以大大減少低效地初始化數據成員的機會。

使用初始化列表的好處