深拷贝和浅拷贝
#include<bits/stdc++.h>
using namespace std;
class Person{
public:
Person(){
cout<<"Person的默认构造函数调用"<<endl;
}
Person(int age,int height){
cout<<"Person的有参构造函数调用"<<endl;
m_Age=age;
m_Height=new int(height);
}
Person(const Person &p){
cout<<"Person的拷贝构造函数调用"<<endl;
m_Age=p.m_Age;
m_Height=new int(*p.m_Height);
}
~Person(){
if(m_Height!=NULL){
delete m_Height;
m_Height=NULL;
}
cout<<"Person的析构函数调用"<<endl;
}
int m_Age;
int *m_Height;
};
void test01(){
Person p1(18,160);
cout<<"p1的年龄为:"<<p1.m_Age<<" 身高为:"<<*p1.m_Height<<endl;
Person p2(p1);
cout<<"p2的年龄为:"<<p2.m_Age<<" 身高为:"<<*p2.m_Height<<endl;
}
int main(){
test01();
return 0;
}
- 对象拷贝和拷贝构造函数:
- 在
test01()
中,通过 Person p2(p1);
进行对象 p1
到对象 p2
的拷贝初始化。 - 这里会调用
Person
类中的拷贝构造函数来完成对象的拷贝操作。
- 拷贝构造函数的实现:
- 在
Person
类中定义了拷贝构造函数 Person(const Person &p)
。 - 在拷贝构造函数中,进行了深拷贝操作,即对
m_Height
所指向的动态内存进行了新的分配,避免了浅拷贝带来的问题。
- 动态内存管理:
- 在
Person
类中,使用了动态内存分配来存储身高信息,通过 new int(height)
来动态分配内存。 - 在拷贝构造函数和析构函数中,需要正确管理动态分配的内存,避免内存泄漏或重复释放的问题。
- 析构函数的作用:
- 在
Person
类中,定义了析构函数 ~Person()
,用于释放动态分配的内存。 - 在析构函数中,通过
delete
关键字释放了 m_Height
所指向的动态内存,并将指针置为 NULL
,以防止悬空指针。
- 拷贝构造函数的必要性:
- 因为
Person
类中存在动态分配的内存,所以需要自定义拷贝构造函数来确保对象的深拷贝,避免浅拷贝带来的问题。
- 如果属性有在堆区开辟的,一定要自己提供拷贝构造函数,防止浅拷贝带来的问题