c++深拷贝浅拷贝问题

/*若使用浅拷贝,两个对象的data指针指向同一块内存空间,当对象析构的时候,会释放两次同一个地址的内存,出现程序coredump
解决方法1:重写拷贝构造函数,当用一个对象初始化另外一个对象时,会调用拷贝构造函数,在拷贝构造函数内执行深拷贝
############################################################################################################################
方法1只是解决了使用一个对象初始化另外一个对象时的浅拷贝问题,如果出现以下情况,还是会引起coredump 所以需要重载等号操作符
MyStr str1("asdfgh");
MyStr str3("sda");
str3 = str1;
############################################################################################################################
若想实现连等操作,需要返回该对象,刚好符合等号的左操作数,实现链式编程
*/
#include<iostream>
#include<string.h>
#include<stdlib.h>
using namespace std;
//字符串类
class MyStr
{
	friend ostream & operator<<(ostream &out, MyStr& str);//友元函数
public:
	//构造函数 
	MyStr(char *data)
	{

		int len = strlen(data);
		this->len = len;
		this->data = new char[len + 1];	//重新分配内存
		for (int i = 0; i<len; i++)
		{
			this->data[i] = data[i];//一个一个复制 
		}
		this->data[len] = 0;

	}
	//拷贝构造函数
	MyStr(MyStr& s1)
	{
		this->len = s1.len;
		this->data = new char[s1.len+1];
		for (int i = 0; i < s1.len; i++) 
		{
			this->data[i] = s1.data[i];
		}
		this->data[s1.len] = '\0';
	}
	//析构函数 
	~MyStr()
	{
		if (this->data != NULL)
		{
			delete[] data;
			this->len = 0;
			this->data = NULL;
		}
	}
	//重载等号操作符
	MyStr& operator=(MyStr &str) 
	{
		this->len = str.len;
		this->data = new char[str.len+1];
		for (int i = 0; i < str.len; i++) 
		{
			this->data[i] = str.data[i];
		}
		this->data[str.len]='\0';
		return *this;
	}
	
private:
	int len;//字符串长度
	char* data;//字符串 
public:
	void print()
	{
		cout << "字符串:" << this->data << ",长度:" << this->len << endl;
	}
};
//重载<<操作符(需使用全局函数法重载)
ostream & operator<<(ostream &out,MyStr& str)
{
	out << "data:" << str.data << ",len:" << str.len<<endl;
	return out;
}
int main()
{
	MyStr str1("asdfgh");
	str1.print();
	MyStr str2 = str1; 
	str2.print();
	MyStr str3("sda");
	str3 = str1;
	str3.print();
	MyStr str4("sda");
	MyStr str5("sda");
	MyStr str6("sda");
	str4 = str5 = str6 = str1;
	cout << str4 << str5 << str6;
	system("pause");
	return 0;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值