Effective_C++:16、在operator=中爲所有的data members設定(賦值)內容

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;
        另外,此時,在拷貝構造函數中,同樣需要完成基類數據成員的賦值操作,最好的辦法是在成員初始化列表對基類數據進行初始化。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章