重載賦值函數與複製構造函數

關於運算符重載問題,以及複製構造函數等。這些都是十分容易讓人的凌亂的東西,所以我覺得,有必要好好的梳理一下他們。


1.重載賦值(=)運算符
關於重載賦值函數,一個容易混亂的地方便是,到底是誰賦值給誰?以及,怎麼賦值? 爲何和複製構造函數那麼像,他們之間又有什麼區別?

Book & Book::operator=(const Book &b){
    if( this != &b){
        this->price = b.price;
        this->num = b.num;
        //爲bookmark賦值
        int *bmTemp = new int[b.num];
        for(int i=0; i<b.num; i++){
            bmTemp[i] = b.bookmark[i];
        }
        this->bookmark = bmTemp;
    }
    return *this;
}
1.賦值給誰? 我的方法便是,這樣理解Book::operator=(Book &) 就是 Book.operator=(Book & ) 

所以對於Book的兩個對象,比如java 和ccc ,ccc=java 的意思其實是ccc.operator(java); 

2.重載賦值語句中需要寫什麼?

和複製構造函數類似,重載賦值語句是有參數的。參數是值得來源

重載賦值語句的必要是,數據成員有指針,並且存在動態內存分配的時候,賦值的時候,不可以只是簡單的將指針的值賦值過去,而是需要爲賦值的指針分配存儲值得空間。所以,主要的操作便是對this->的指針進行動態內存分配,並將值賦值過來(記住,當自己寫重載賦值函數的時候,不要丟掉別的部分,雖然在默認的賦值函數中,他們是正確的,但自己重寫函數的時候,默認構造函數便不再調用!)

認識到 賦值函數中的this指的是 = 號左邊被賦值的。

2.複製構造函數

複製構造函數,首先,他是構造函數的範疇,是用來構造對象的。

其次,便要意識到,在複製構造函數中的this 指的是,即將創建的這個對象的屬性,而複製構造函數的參數,是你複製的模板(這個和重載賦值語句很像)

再而,複製構造函數沒有return;

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