淺拷貝、深拷貝和淺賦值、深賦值

#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
這隻適合入門編寫深賦值語句的玩家,對於更高級的編程來說,要考慮到開闢空間是否成功,若不成功則會使賦值失敗。
何時該編寫拷貝賦值語句:
只要類裏面存在以指針類型存在的成員對象時,我們就要重新編寫,不能使用系統自帶默認函數。

發佈了45 篇原創文章 · 獲贊 25 · 訪問量 3069
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章