深浅拷贝浅解
来源:互联网 发布:弘扬软件股份有限公司 编辑:程序博客网 时间: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;
};
阅读全文
0 0
- 深浅拷贝浅解
- 深浅拷贝
- 深浅拷贝
- 深浅拷贝
- 深浅拷贝
- 深浅拷贝
- 深浅拷贝
- 深浅拷贝
- 深浅拷贝
- 深浅拷贝
- 深浅拷贝
- 深浅拷贝
- 深浅拷贝
- 深浅拷贝
- 深浅拷贝
- 深浅拷贝
- 深浅拷贝
- 深浅拷贝
- word2vec 构建中文词向量
- VS2015动态库编程之导出C++类(下)
- 随笔一篇
- 【洛谷T7153】(考试) 中位数
- Ubantu下bilibili开源ffmpeg编译
- 深浅拷贝浅解
- mysql之事务详解
- 校验下载的CentOS镜像是否完整
- Java经典算法40例(十七)
- mysql中case when用法与及注意事项
- 黑马商城项目(三)之二
- Java Reference源码分析
- Java经典算法40例(十八)
- Easyui Datagrid 根据参数设定样式