16、在operator=中爲所有的data members設定(賦值)內容
1、默認的assignment運算符與自定義的assignment運算符
在自定義一個class時,若沒有聲明assignment運算符,則編譯器會爲class產生一個缺省的assignment運算符。默認的assignment運算符,將會使得對象的每個數據成員都按照二進制值進行拷貝。
而有些時候,我們希望assignment運算符不完全按照默認的assignment運算符執行,如之前Effective_C++:11(
Effective_C++:11)中提到的,在class內有動態內存分配時,需要自定義assignment運算符,修改指針的拷貝方式,是將指針指向的變量內容進行拷貝。而其他不改變的部分,同樣需要我們一一列出。因爲若我們自定義了assignment運算符,編譯器將不會再產生一個默認的assignment運算符。
2、在operator=中爲所有的data members設定內容
當聲明一個class時,撰寫自定義的assignment運算,我們可以很容易的對所有的成員設定內容。
而當對class進行升級添加新成員時,亦要記得同步修改構造函數、assignment運算符。
然而,在涉及繼承時,assignment運算符中所有的data members也包含基類的data members。即派生類的assignment運算符也需要處理基類數據成員的賦值操作。而很有可能基類數據成員是private,不能在派生類中直接進行賦值操作。因此:
1.一種方法是以派生類對象爲參數調用基類的operator=(),完成派生類對象中基類數據成員的賦值操作。
Base::operator=(rhs);//rhs爲入參,const Dirived& rhs;
2.另一種方法是將*this轉換爲基類引用類型,調用assignment運算符完成基類數據成員的賦值操作。
static_cast<Base&>(*this) = rhs;//rhs爲入參,const Dirived& rhs;
另外,此時,在拷貝構造函數中,同樣需要完成基類數據成員的賦值操作,最好的辦法是在成員初始化列表對基類數據進行初始化。