浅拷贝:简单的赋值操作
深拷贝:在堆区重新申请内存,进行拷贝操作。
#include<iostream>
using namespace std;
#include<string>
class CPerson
{
public:
CPerson()
{
cout<<"无参构造函数"<<endl;
}
CPerson(string name,int age)
{
m_Name=name;
m_Age=new int(age); //在堆区申请一个内存,存放m_Age
cout<<"有参构造函数"<<endl;
}
//当类中有属性在堆区,调用拷贝构造函数时,必须重新写拷贝构造函数,以防止浅拷贝带来的问题
CPerson(const CPerson & p)
{
this->m_Name=p.m_Name;
this->m_Age=new int(*p.m_Age);
cout<<"拷贝构造函数"<<endl;
}
~CPerson()
{
if(m_Age!=NULL)
{
delete m_Age;
}
cout<<"析构函数"<<endl;
}
public:
string m_Name ;
int *m_Age;
};
void test01()
{
CPerson p1("唐三",100);
CPerson p2(p1);
//当不写构造函数时,调用拷贝构造函数,创建在堆区的同一个属性,有相同的地址
//程序运行完时,编译器自动调用析构函数,调用p1析构函数时,释放一次内存,调用p2析构函数时,又释放了一次
//相同的地址释放两次,导致系统崩溃
//cout<<p1.m_Name<<"---"<<p1.m_Age<<endl;
//cout<<p2.m_Name<<"---"<<p2.m_Age<<endl;
cout<<p1.m_Name<<"---"<<*p1.m_Age<<endl;
cout<<p2.m_Name<<"---"<<*p2.m_Age<<endl;
}
int main()
{
test01();
system("pause");
return 0;
}