浅拷贝:简单的值传递(若存在堆区的对象成员,即拷贝其指针指向的地址)
深拷贝:需要在堆区重新开辟新的空间,传递新内存空间的地址
若类对象的成员变量(属性)有在堆区开辟的,一定需要自己构造拷贝构造函数(深拷贝),防止浅拷贝带来的多次释放堆区空间问题。
下面通过例子具体说明:
#include <iostream>
#include <string>
using namespace std;
// 深拷贝与浅拷贝
//浅拷贝:简单的值传递(若存在堆区的对象成员,即拷贝其指针指向的地址)
//深拷贝:需要在堆区重新开辟新的空间
class Person{
private:
string Pname;
int* Page;
public:
//有参构造函数(若用户自定有参构造函数,则系统不默认生成无参构造函数)
Person( string name, int age ){
Pname = name;
Page = new int(age); //堆区开辟空间存储age
}
//拷贝构造函数(若用户自定拷贝构造函数,则系统不默认生成无参构造函数)
Person( const Person& person ){
Pname = person.Pname;
//Page = person.Page; //浅拷贝:只拷贝Page指针指向的堆区地址
Page = new int(*person.Page); //深拷贝:在堆区开辟新空间存储age,Page指向该地址
}
//析构函数:清除程序员在堆区开辟的空间
~Person(){
cout<<"delet age:"<<*Page<<endl;
if( Page != NULL){
delete Page;
Page = NULL;
}
}
void showPerson(){
cout<<"(name,age):"<<Pname<<","<<*Page<<endl;
}
};
int main(){
string name1 = "yiket";
int age1 = 18;
Person p1(name1, age1);
Person p2(p1);
p1.showPerson();
p2.showPerson();
}
浅拷贝:多次释放同一堆区空间问题
深拷贝: