淺拷貝是不會分配新的記憶體的,深拷貝才能分配。
先考慮一種情況,對乙個已知物件進行拷貝,編譯系統會自動呼叫一種建構函式——拷貝建構函式,如果使用者未定義拷貝建構函式,則會呼叫預設拷貝建構函式。
舉乙個例子:
#include
using
namespace std;
class
student
;student::
student()
student::
~student()
intmain()
system
("pause");
return0;
}
可以看到,我們在類裡面有指標成員是一定要自定義拷貝構造的,否則會兩次析構,造成不好的結果。
student
~student 0x7fff49926898
~student 0x7fff49926888
sh: 1: pause: not found
現在,我們成對使用new, delete開闢空間和析構:
#include
using
namespace std;
class
student
;student::
student()
student::
~student()
student::
student
(const student &s)
intmain()
return0;
}
結果可以看到,兩次構造,並析構了來自兩個位址的記憶體。
student
copy student
~student 0x7ffcb3f1b6d8
~student 0x7ffcb3f1b6c8
深拷貝和淺拷貝
淺拷貝就是物件的資料成員之間的簡單賦值,如你設計了乙個沒有類而沒有提供它的複製建構函式,當用該類的乙個物件去給令乙個物件賦值時所執行的過程就是淺拷貝,如 class a a private int data int main 這一句b a 就是淺拷貝,執行完這句後b.data 5 如果物件中沒有其他...
淺拷貝和深拷貝
以下情況都會呼叫拷貝建構函式 乙個物件以值傳遞的方式傳入函式體 例如 已知class a,class b void func a a void func a a func b b 此時函式對b的操作是呼叫拷貝建構函式後的臨時拷貝物件。多數傳指標 乙個物件以值傳遞的方式從函式返回 如 return b...
深拷貝和淺拷貝
ios提供了copy和mutablecopy方法,顧名思義,copy就是複製了乙個imutable的物件,而mutablecopy就是複製了乙個mutable的物件。以下將舉幾個例子來說明。1 系統的非容器類物件 這裡指的是nsstring nsnumber等等一類的物件。nsstring stri...