浅拷贝与深拷贝

浅拷贝:简单的赋值操作

深拷贝:在堆区重新申请内存,进行拷贝操作。

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值