在c++中,普通变量之间的复制是很简单的,比如
int a = 3;
int b = a;
但是,对于类的对象之间的拷贝往往是相对复杂的,比如下面的例子。在这个例子中,在实例化类的对象s1时,系统调用构造函数,申请了一段内存,是正确的;但是在实例化对象s2时,系统调用的是拷贝构造函数,拷贝构造函数虽然复制了一份构造函数的内容,但是s2申请的内存和s1申请的内存是同一块内存,那么在释放内存时就会出现异常,如果对象s1先释放内存,这是对象s2中的指针就是迷途指针了,会运行出错。深拷贝和浅拷贝可以简单理解为:如果一个类拥有资源,当这个类的对象发生复制过程的时候,资源重新分配,这个过程就是深拷贝,反之,没有重新分配资源,就是浅拷贝。
class student
{
public:
//构造函数
student()
{
name = "jim";
p = new int[10];
}
//拷贝构造函数
student(const student &stu)
{
name = stu.name;
p = stu.p;
}
private:
string name;
int *p;
};
int main()
{
student s1;
student s2 = s1;
return 0;
}
那么什么是深拷贝呢?再看下面这段代码,对于拷贝构造函数,我们重新申请内存,只将对象s1中申请内存中的内容拷贝进对象s2中,而两个对象的内存并不是同一段内存,因此进行了对象间的深拷贝。
class student
{
public:
//构造函数
student()
{
name = "jim";
p = new int[10];
}
//拷贝构造函数
student(const student &stu)
{
//无需重新申请空间的变量正常赋值
name = stu.name;
//重新申请内存并一一复制值
p = new int[10];
for(int i = 0; i < 10; i++)
{
p[i] = stu.p[i];
}
}
private:
string name;
int *p;
};
int main()
{
student s1;
student s2 = s1;
return 0;
}