浅拷贝:
利用编译器默认拷贝方式,类做参数
//浅拷贝
class a
{
public:
int b=10;
};
int main()
{
a a1; //a类变量a1;
a a2(a1); //使用编译器自带的拷贝方式
//将对象a1作为参数,构造新对象a2
}
如果参数中含有new申请空间,且析构函数释放内存,那么
拷贝构造对象,将会按照析构顺序释放指针
且:被释放过“一次”的指针,就失去了对其的访问权限,不可再次释放
class lei
{
public:
int a1,*p;
lei()
{
a1=10;
p=new int(a1);
}
~lei()
{
delete(p);
}
};
int main()
{
lei a1;
lei a2(a1);
}
以下为上述代码执行顺序
a1.lei() //先构造a1
a2.lei(const lei & a1) //再构造a2(编译器内默认的拷贝构造函数)
a2.~lei() //析构a2
a1.~lei() //析构a1出错,因为a2中已经释放了和a1相同的地址
## 深拷贝:
深拷贝需要程序员“手动实现”拷贝构造函数,为每个动态空间分配唯一的空间和地址,从而避免上诉错误
class lei
{
public:
int a1=10, * p;
lei(const lei& p) //手动实现拷贝构造函数
{
this->p = new int(p.a1);
}
lei()
{
p = new int(a1);
}
~lei()
{
delete(p);
}
};
int main()
{
lei a1;
lei a2(a1);
}
(思考:继承是否可能就是依据拷贝函数实现?)