浅复制:
关于浅复制:
●在用一个对象初始化另一个对象时,只复制了数据成员,而没有复制资源,使两个对象同时指向了同一资源的复制方式称为浅复制。
●默认复制构造函数所进行的是简单数据复制,即浅复制
#include <iostream>
#include <cstring>
using namespace std;
class Person
{
public:
Person(char* name1,int a,double s);
void display(){cout<<name<<“\t”<<age<<“\t”<<salary<<endl;}
~Person(){delete name;} //析构函数的声明
private:
char* name;
int age;
double salary;
};
Person::Person(char* name1,int a,double s)
{
name=new char[strlen(name1)+1];
strcpy(name,name1);
age=a;
salary=s;
}
main()
{
Person P1("WangWei ",8,3880); //调用构造函数创建对象P1
P1.display();
Person P2(P1); //调用复制构造函数,用P1的数据初始化对象P2
P2.display();
}
浅复制存在的问题:
当程序运行结束时,p2对象调用析构函数,p1对象调用析构函数时,name所指向的空间已经不存在,此时发生错误。
深复制:
当类的数据成员含有指针类型时,浅复制构造函数存在问题。此时需要定义深复制构造函数。
关于深复制:
●通过一个对象初始化另一个对象时,不仅复制了数据成员,也复制了资源的复制方式称为深复制。
•
缺省的复制构造函数是浅复制构造函数
•
深复制构造函数必须显式定义
•
当成员变量中含有指针变量时,需要定义深复制构造函数
•
深复制构造函数的特点
–
定义:类名
::
类名
(
[
const
]
类名
&
对象名)
;
–
成员变量的处理:对指针类型的成员变量,使用
new
操作符进行空间的申请,然后进行相关的复制操作
Person::Person(const Person& P0) //复制构造函数的实现
{
name=new char[strlen(P0.name)+1];
strcpy(name,P0.name);
age=P0.age;
salary=P0.salary;
}
综上所述,我对深复制浅复制的认识即为:
当形参中有指针时,使用深复制。因为如果使用浅复制会使生成一个对象后,当它调用析构函数时,会回收指针指向的空间,造成下一个对象指针指向的空间为空。