今天主播来讲一下深浅拷贝,是面试的一个坑
(1)浅拷贝-简单的赋值拷贝操作
#include<bits/stdc++.h>
using namespace std;
class person{
public:
person(int age,int height){
m_age=age;
m_height=new int(height);
}
~person(){
if(m_height!=NULL){
delete m_height;
m_height=NULL;
}
}
int m_age;
int *m_height;
};
void test01(){
person p1(18,160);
person p2(p1);
cout<<p1.m_age<<" "<<*p1.m_height<<endl;
cout<<p2.m_age<<" "<<*p2.m_height<<endl;
}
int main()
{
test01();
}
p1和p2同时指向堆区,在函数执行结束之后执行析构函数的释放堆区内存,p1和p2连续释放两次导致代码错误
(2)深拷贝-在堆区重新申请空间,进行拷贝操作
自己实现拷贝构造函数,解决浅拷贝带来的问题
#include<bits/stdc++.h>
using namespace std;
class person{
public:
person(int age,int height){
m_age=age;
m_height=new int(height);
}
person(const person &p){
m_age=p.m_age;
m_height=new int(*p.m_height);
}
~person(){
if(m_height!=NULL){
delete m_height;
m_height=NULL;
}
}
int m_age;
int *m_height;
};
void test01(){
person p1(18,160);
person p2(p1);
cout<<p1.m_age<<" "<<*p1.m_height<<endl;
cout<<p2.m_age<<" "<<*p2.m_height<<endl;
}
int main()
{
test01();
}
自己在拷贝函数中重新申请堆内存,实现深拷贝