什麼時候需要定義自己的拷貝構造函數:
當類中包含有,動態分配成員 或者 指針 的時候。 如果使用默認構造函數,則新構造出來的 新類 和 舊類 裏面的指針成員 指向同一個空間, 而當其中一個類 清空掉那個空間 。另一個類的指針就會變成野指針(因爲空間已經被清空) , 也就是說默認構造函數是複製值(地址也是值)
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)
兩者區別 : 根據是否生成新對象 。 如果是生成對象,則調用複製構造函數 。 如果對象已經有了。則調用 賦值函數
因此兩者所定義的內容也應該有所區別。 複製構造函數針對一個 空的對象。 含有指向內存空間的東西都應該另外開闢新空間
賦值函數針對一個 已經存在的對象, 要將原來的成員重新賦值(如果有舊的),並且刪除舊的(檢查是否是自賦值,釋放原有空間,分配新的內存資源,並複製,。返回本對象的引用)