浅拷贝、深拷贝和浅赋值、深赋值

#include<iostream>
#include<string.h>
using namespace std;

class String
{
public:
	String(const char *str="")
	{
		if(str==NULL)
		{
			data=(char*)malloc(sizeof(char));
			data[0]='\0';
		}
		else
		{
			data=(char*)malloc(sizeof(char)*(strlen(str)+1));
				strcpy(data,str);
		}
	}
	/*
	//浅拷贝  也就是系统默认的拷贝,可写可不写。
	String (const String &s)//默认的拷贝构造  
	{
	data=s.data;
	}
	*/
	//深拷贝
	String (const String &s)//String s2(s1);
	{
		data=(char*)malloc(sizeof(char)*(strlen(s.data)+1));
		strcpy(data,s.data);
	}
	//深赋值
	String& operator=(const String &s)//	String s3;	s3=s2;
	{
		if(this !=&s)
		{
			free(data);
			data=NULL;//在这块要先释放原有的内存空间,然后再开辟,不然会导致内存泄漏
			data =(char*)malloc(sizeof(char)*(strlen(s.data)+1));
			strcpy(data,s.data);
		}
		return *this;
	}

	~String()
	{
		free(data);
		data=NULL;
	}
private:
	char *data;
};

void main()
{
	char *str="hello";
	String s1(str);

	String s2(s1);

	String s3;
	s3 = s2;
}

浅拷贝:只拷贝了指针的指向,会造成同一个空间会被释放多次。
深拷贝:不仅拷贝指向并且拷贝空间。
一般深赋值函数语句的编写四步骤:
1-判断是否给自身赋值;
2-释放原有空间,并置空;
3-开辟空间,进行拷贝赋值;
4-返回*this
这只适合入门编写深赋值语句的玩家,对于更高级的编程来说,要考虑到开辟空间是否成功,若不成功则会使赋值失败。
何时该编写拷贝赋值语句:
只要类里面存在以指针类型存在的成员对象时,我们就要重新编写,不能使用系统自带默认函数。

猜你喜欢

转载自blog.csdn.net/weixin_41747893/article/details/88031403