#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
这只适合入门编写深赋值语句的玩家,对于更高级的编程来说,要考虑到开辟空间是否成功,若不成功则会使赋值失败。
何时该编写拷贝赋值语句:
只要类里面存在以指针类型存在的成员对象时,我们就要重新编写,不能使用系统自带默认函数。