深浅拷贝浅解

来源:互联网 发布:弘扬软件股份有限公司 编辑:程序博客网 时间:2024/05/25 12:21

深浅拷贝

浅拷贝

浅拷贝就是源对象与拷贝对象共用一份实体,只是所引用的变量名不一样,其实还是同一块地址。就像一个人有两个名字,叫铁柱是在叫他,叫二狗也是在叫他。

class String
{
public:
String(const char *s)
:_str(new char[strlen(s)+1])
{
strcpy(_str, s);
}
String(const String& s)
{
_str = s._str;//指向了同一块空间
}
~String()
{
delete[] _str;
}
String operator=(const String& s)
{
if (_str != s._str)//自己给自己赋值不处理
_str = s._str;
}
private:
char* _str;
};

深拷贝

深拷贝是指源对象与拷贝对象互相独立,其中任何一个对象的改动都不会对另外一个对象造成影响。例如有一个人叫铁柱,还有一个人叫二狗,有一天铁柱少了一条胳膊。于理这根本不会影响到二狗(但不排除这两人感情深呢!于情这就有可能影响了,但计算机是无情无血的机器,它可不管这么多)。 
深拷贝的传统写法

class String
{
public:
String(const char* str)
:_str(new char[strlen(str)+1])
{
strcpy(_str, str);
}
String(const String& str)
{
_str = new char[strlen(str._str) + 1];//拷贝构造时开辟新的空间
strcpy(_str, str._str);//把需要拷贝的数据拷到新空间
}
~String()
{
delete[] _str;
_str = NULL;
}
String& operator=(const String& str)
{
if (this != &str)//排除自己给自己赋值
{
delete[] _str;//先释放源空间
_str = new char[strlen(str._str) + 1];//再开辟一片与目标空间大小一样的空间
strcpy(_str, str._str);//将数据拷进去
return *this;
}
}
private:
char* _str;
};

深拷贝的后现代资本主义写法 
思路就是拿别人的工资,活都让别人做。利用类的默认自动调用构造函数来为拷贝构造开辟空间,后交换拿到所需的数据,出局部域后析构不需要的数据。

class String
{
public:
String(const char* str = "")
{
if (str == NULL) { _str = new char[1]; *_str = 0;}_str = new char[strlen(str)+1];strcpy(_str, str); }
String(const String& str)
:_str(NULL)//必须初始化为空,释放空指针不会出错
{
String tmp(str._str);
swap(_str,
tmp._str);//1,得到想要的数据str._str 2,_str出局部域被析构
}
~
String()
{
delete[] _
str;
_
str = NULL;
}
String& operator=(String str)
{
swap(_
str, str._str);
return *this;
}
private:
char* _str;
};
原创粉丝点击