深浅拷贝问题

深浅拷贝的认识与理解·

浅拷贝:按照被拷贝的对象的存储地址进行拷贝(不开辟新空间),一般为编译器默认的拷贝构造函数

深拷贝:创建一个新的空间,将需要拷贝的数据依次进行拷贝

class Date
{
public:
	Date(int year = 1, int month = 1, int day = 1)
	{
		_year = year;
		_month = month;
		_day = day;
	}
	void print()
	{
		cout << _year << "-" << _month << "-" << _day << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};
int main()
{
	Date s1(2014,5,6);
	Date s2(s1);
	s1.print();
	s2.print();
	return 0;
	}

在这里插入图片描述
可以看出,在简单的拷贝中,不涉及销毁原对象,系统默认的浅拷贝是可以的。

class _string
{
public:
	_string(const char* str = " ")
	{
		_str = new char[strlen(str) + 1];
		strcpy(_str, str);
	}
	~_string()
	{
		delete[]_str;
		_str = nullptr;
	}
private:
	char* _str;
};
void test()
{
  _string s1("hello world");
	_string s2(s1);
}

可以看到,代码崩掉了,这是为啥呢???

在这里插入图片描述
此时我们先需要自己写一个拷贝构造,完成拷贝

class _string
{
public:
	_string(const char* str = " ")
	{
		_str = new char[strlen(str) + 1];
		strcpy(_str, str);
	}
	_string(const _string& str)
		:_str(new char[strlen(str._str)+1])
	{
		strcpy(_str, str._str);
	}
	void print()
	{
		cout << _str << endl;
	}
	~_string()
	{
		delete[]_str;
		_str = nullptr;
	}
private:
	char* _str;
};
void test()
{
  _string s1("hello world");
	_string s2(s1);
	s1.print();
	s2.print();
}

完成拷贝
在这里插入图片描述
总结:
浅拷贝:编译器只是将对象中的值拷贝过来,会导致多个对象共享一份资源,当一个对象销毁时会将该资源释放,其他对象继续释放时,会发生违规访问。
深拷贝:给每一个对象分配独立的资源,保证对象之间的没有耦合度,一般要开辟新空间存储。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值