深拷貝和淺拷貝
同一類型的對象之間可以賦值,使得兩個對象的成員變量的值相同,兩個對象仍然是獨立的兩個對象,這種情況被稱爲淺拷貝。
一般情況下,淺拷貝沒有任何副作用,但是當類中有指針,並且指針指向動態分配的內存空間,析構函數做了動態內存釋放的處理,會導致內存問題。
淺拷貝
也就是說淺拷貝p1對象的pName指針與p2對象的pName指針指向的地址相同
深拷貝
當類中有指針,並且此指針有動態分配空間,析構函數做了釋放處理,往往需要自定義拷貝構造函數,自行給指針動態分配空間,深拷貝。
也就是說深拷貝p1對象的pName指針與p2對象的pName指針指向的地址不相同
class Person{
public:
Person(char* name,int age){
pName = (char*)malloc(strlen(name) + 1);
strcpy(pName,name);
mAge = age;
}
//增加拷貝構造函數
Person(const Person& person){
pName = (char*)malloc(strlen(person.pName) + 1);
strcpy(pName, person.pName);
mAge = person.mAge;
}
~Person(){
if (pName != NULL){
free(pName);
}
}
private:
char* pName;
int mAge;
};
void test(){
Person p1("Edward",30);
//用對象p1初始化對象p2,調用c++提供的默認拷貝構造函數
Person p2 = p1;
}