拷貝構造函數 和 賦值操作符重載

前幾天第一次面試被問到拷貝構造函數。立馬想到那操作符 = 號重載是鬧哪樣的。。平時根本沒注意到。學藝不精。沒有認真學。這不。。一問馬上就意識到其中有問題沒弄清楚,還有深拷貝,淺拷貝。反正這次也只打算拿經驗。趕緊把缺的補上


什麼時候需要定義自己的拷貝構造函數:
    當類中包含有,動態分配成員 或者 指針 的時候。 如果使用默認構造函數,則新構造出來的 新類 和 舊類 裏面的指針成員 指向同一個空間, 而當其中一個類 清空掉那個空間 。另一個類的指針就會變成野指針(因爲空間已經被清空) , 也就是說默認構造函數是複製值(地址也是值) ps.基本數據類型的數組可以直接使用默認複製構造函數。也就是說有涉及到 自行開闢額外空間 的數據類型 和 指針 的類就需要


什麼時候調用拷貝構造函數:
    1.一個對象以 值傳遞 的方式 傳入 一個函數
    ps: 拷貝構造函數 的形參 必須是 引用,  因爲 當對象形參以 值傳遞 形式 傳入 函數時, 會創建一個臨時變量 複製對象形參,這個時候又是一樣的步驟。創建臨時變量。最終堆棧溢出 。     而當傳入的是 對象引用 時,函數可以直接使用對象,無需創建新對象。不會造成遞歸堆棧溢出。(const 可以沒有。但最好有。限定只讀,並且 const變量不能隨意轉化爲非const,如果傳入的是const變量,而形參類型非const,則轉化錯誤
    2.一個對象以 值傳遞 的方式 從函數 返回
    3.一個對象給 另一個對象 初始化的時候 
    ps: test 是類名, q是已經初始化過的 對象
            test k(q) 和 test k = q 調用的拷貝構造函數。因爲k是一個未定義的對象
            當k定義過了。 調用的則是 = 號操作符
            test k;     //先定義了(默認構造函數初始化基本類型成員)
            k = q;    //調用 = 操作符  


淺拷貝: 只是簡單的值複製。數組也同樣有效
深拷貝: 爲指針所指向的。 另外開闢新的內存空間並複製 。 拷貝和被拷貝的對象。成員指針指向 包含同一值的。不同內存空間


拷貝構造函數:
    聲明: test( const test & cpy)
    類外定義:  test:: test(const test &cpy)

賦值操作符重載
    聲明:test& test::operate = (const test & cpy)
    類外定義: test& test:: operate = (const test & cpy)
兩者區別 : 根據是否生成新對象 。 如果是生成對象,則調用複製構造函數 。 如果對象已經有了。則調用 賦值函數
                    因此兩者所定義的內容也應該有所區別。   複製構造函數針對一個 空的對象。 含有指向內存空間的東西都應該另外開闢新空間
                    賦值函數針對一個 已經存在的對象, 要將原來的成員重新賦值(如果有舊的),並且刪除舊的(檢查是否是自賦值,釋放原有空間,分配新的內存資源,並複製,。返回本對象的引用)

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