#include<iostream>
using namespace std;
class String //私有成员变量中有指针类型,一般要编辑拷贝构造函数和赋值函数,预防浅拷贝和浅赋值
{
public:
//构造函数
String(const char *str = "")
{
if(*str == NULL)//为空不等价于为‘\0’
{
data = (char*)malloc(sizeof(char));
data[0] = '\0';
}
else
{
data = (char*)malloc(sizeof(char)*(strlen(str)+1));
strcpy(data,str);
}
}
//赋值函数(深赋值)
String& operator=(const String &s)//使用引用赋值可以节省开辟新空间,提高效率
{
if(this != &s)//判断自赋值
{
free(data);//释放原有空间,避免内存泄漏
data = NULL;//赋空
data = (char*)malloc(sizeof(char)*(strlen(s.data)+1));//开辟空间(含\0)
strcpy(data,s.data);//拷贝
}
return *this;//返回自身对象
}
//浅拷贝,只改变指针指向,析构的时候会把同一空间析构多次,造成运行错误
/*String(const String &s)
{
data = s.data;
}*/
//深拷贝,开辟新空间并改变指针指向
String(const String &s)
{
data = (char*)malloc(sizeof(char)*(strlen(s.data)+1));
strcpy(data,s.data);
}
//析构函数
~String ()
{
free(data);
data = NULL;
}
private:
char *data;
};
void main()
{
char *str = NULL;
String s1;
String s2(s1);
String s3;
s3 = s2;
}
深浅拷贝和赋值
最新推荐文章于 2023-09-08 15:55:56 发布