淺拷貝和深拷貝具體詳解

2021-08-19 13:43:51 字數 937 閱讀 9556

當用乙個已經初始化了的自定義類型別物件去初始化另乙個新構造的物件的時候,拷貝建構函式就會被自動呼叫,也就是說,當類的物件需要拷貝時,拷貝建構函式將會被呼叫。

以下情況都會呼叫拷貝建構函式:

(1)乙個物件以值傳遞的方式傳入函式體

(2)乙個物件以值傳遞的方式從函式返回

(3)乙個物件需要通過另乙個物件進行初始化

淺拷貝和深拷貝的概念:

淺拷貝:如果在類中沒有顯示的宣告乙個拷貝建構函式,那麼,編譯器會自動生成乙個預設的拷貝建構函式,該建構函式完成物件之間的位拷貝,而位拷貝又稱為淺拷貝。以下就是淺拷貝,而淺拷貝的過程就是說在某些情況下,需要用已初始化的物件去初始化乙個新物件的時候,在沒有自定義的拷貝建構函式時,系統呼叫預設建構函式,編譯通過,但此時,a和b將指向同乙個記憶體,根據建構函式和析構函式的特點,先構造的後析構,所以b會先析構,將這塊記憶體的外部資源釋放,再將記憶體釋放,之後a內的指標就是野指標了,出現執行錯誤。

#includeusing namespace std;

class a:

~a(){}

}int main()

深拷貝:如果乙個類擁有資源,當這個類的物件發生複製過程的時候,資源重新分配,這個過程就是深拷貝。

#includeusing namespace std;

class a:

~a(){}

void a(const class &str)

private:

int ma;

int mb;

}int main(){

a a(10);

a b=a;

所以說,自定義拷貝建構函式是一種良好的程式設計風格,它可以阻止編譯器形成預設的拷貝建構函式,提高原始碼效率。

深拷貝和淺拷貝 具體實現

我們先來說一下淺拷貝 var obj var b obj console.log b 輸出結果為1 這就是淺拷貝 但是淺拷貝會存在乙個問題,我們可以通過 來看一下 var obj var b obj console.log b 我們上面通過淺拷貝拷貝了乙個引用型別,如果我們去修改obj會怎麼樣?va...

python 深拷貝和淺拷貝詳解

指向 賦值語句 b a,淺拷貝 對於乙個物件的頂層拷貝,拷貝了引用,並沒有拷貝內容copy.copy copy.copy 拷貝的是不可變型別 數字,元祖 那麼它不會進行淺拷貝,僅僅是指向 深拷貝 copy.deepcopy 只要有可變型別時,都會複製 如果用copy.copy copy.deepco...

深拷貝和淺拷貝

淺拷貝就是物件的資料成員之間的簡單賦值,如你設計了乙個沒有類而沒有提供它的複製建構函式,當用該類的乙個物件去給令乙個物件賦值時所執行的過程就是淺拷貝,如 class a a private int data int main 這一句b a 就是淺拷貝,執行完這句後b.data 5 如果物件中沒有其他...