今天對c的淺拷貝和深拷貝進行學習,現分享學習心得。
首先看下面的**:
執行結果如下圖:
什麼?結果是ccc ccc ccc?為什麼不是aaa bbb ccc呢?這就是字串的淺拷貝。
程式中arr是乙個長度為100的字元陣列; strarr是乙個長度為3,每個單元格存放這乙個字元指標的數字。
i = 0,程式進入第一次迴圈,arr賦值為aaa,strarr[0] = arr,即將strarr[0]中存放的指標指向arr。
i = 1,程式進入第二次迴圈,arr賦值為bbb,strarr[1] = arr,即將strarr[1]中存放的指標指向arr。
i = 2,程式進入第三次迴圈,arr賦值為ccc,strarr[2] = arr,即將strarr[2]中存放的指標指向arr。
i = 3,程式結束。
我們發現,strarr並沒有自己建立記憶體,只是將指標指向arr,且strarr[0]、strarr[1]、strarr[2]都指向arr,內容都是一樣的, 因此最終程式的結果是列印三次ccc。這就是字串的淺拷貝:多個指標指向同一段記憶體,如記憶體修改,則多個指標的內容同時修改。如果要避免淺拷貝,我們就需要讓每個指標都指向自己的記憶體,利用動態記憶體申請來開闢自己的記憶體,避免多個指標指向同乙個位址。
程式如下:
程式執行結果:
這次就成功將aaa bbb ccc分別賦值給strarr中的每個元素。注意不能使用strarr[i] = arr,這樣的結果還是淺拷貝,字串的拷貝一定要使用字串拷貝函式才能將內容成功拷貝。動態記憶體的大小一定是(strlen(arr)+1) * sizeof(char),因為字串的有效長度是不包括'\0'的,需要加上。深拷貝後,每個指標指向自己的記憶體,不用擔心內容被篡改。
C 學習筆記8 深拷貝和淺拷貝
對於帶有指標的類我們才需要深拷貝和淺拷貝這個問題。time 2020 6 1 author mmyd include includeusing namespace std class strelse 拷貝構造 str const str str 拷貝複製 str operator const str...
C 淺拷貝和深拷貝
class test test const test t val new int t.val test private int val 現在定義兩個物件,test t1 9 test t2 t1 如果你不提供copy建構函式 注釋掉的那個 那麼t1和t2的成員 val指向同乙個物件,當析構的時候,同...
c 深拷貝和淺拷貝
深拷貝和淺拷貝 ca const ca c 就是我們自定義的拷貝建構函式。可見,拷貝建構函式是一種特別的建構函式,函式的名稱必須和類名稱一致,他的唯一的乙個引數是本型別的乙個引用變數,該引數是const型別,不可變的。例如 類x的拷貝建構函式的形式為x x x 當用乙個已初始化過了的自定義類型別物件...