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