浅拷贝&深拷贝&Copy On Write(Sring类)
String类的三种实现
- 浅拷贝
class String
{
public:
String(const char* pdata)//构造函数
:_pdata(new char[strlen(pdata) + ])
{
strcpy(_pdata, pdata);
}
String(const String&s)//拷贝构造
:_pdata(s._pdata)
{}
~String()//析构函数
{
if (NULL != _pdata)
{
delete[]_pdata;
_pdata = NULL;
}
}
String &operator=(const String&s)
{
//检查自赋值
if (this != &s)
{
char*temp = new char[strlen(s._pdata) + ];
strcpy(temp, s._pdata);
delete[]_pdata;
_pdata = temp;
}
return *this;
}
private:
char*_pdata;
};
void main()
{
String s1 ("hello world");
String s2=s1;
}

当类里面有指针对象时,进行简单赋值的浅拷贝,两个对象指向同一块内存,存在崩溃的问题!这里我们要进行深拷贝。
- 深拷贝
# define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<string>
using namespace std;
class String
{
public:
String(const char* pdata)//构造函数
:_pdata(new char[strlen(pdata) + ])
{
strcpy(_pdata, pdata);
}
String(const String&s)//拷贝构造
:_pdata(new char[strlen(s._pdata) + ])
{
strcpy(_pdata, s._pdata);
}
~String()//析构函数
{
if (NULL != _pdata)
{
delete[]_pdata;
_pdata = NULL;
}
}
String &operator=(const String&s)
{
//检查自赋值
if (this != &s)
{
char*temp = new char[strlen(s._pdata) + ];
strcpy(temp, s._pdata);
delete[]_pdata;
_pdata = temp;
}
return *this;
}
private:
char*_pdata;
};
//简洁版
class String
{
public:
String(const char* pData)
: _pData(new char[strlen(pData) + ])
{
strcpy(_pData, pData);
} String(const String& s)
: _pData(NULL)
{
String temp(s._pData);
std::swap(_pData, temp._pData);
} String& operator=(const String& s)
{
if (this != &s)
{
String temp(s._pData);
std::swap(_pData, temp._pData);
}
return *this;
}
~String()
{
if (NULL != _pData)
{
delete[] _pData;
_pData = NULL;
}
}
private:
char* _pData;
};
void main()
{
String s1 ("hello world");
String s2=s1;
}

- 写时拷贝
#include<iostream>
#include<string.h>
#include<assert.h>
namespace COW
{
class String
{
public:
String(const char* pData)
: _pData(new char[strlen(pData) + ])
, _refCount(new int)
{
*_refCount = ;
strcpy(_pData, pData);
} // String s2(s1);
String(String& s)
: _pData(s._pData)
, _refCount(s._refCount)
{
++(*_refCount);
} // s1 = s2;
String& operator=(String s)
{
if (this != &s)
{
if (--(*_refCount) == )
{
delete[] _pData;
delete _refCount;
} _pData = s._pData;
_refCount = s._refCount;
++(*_refCount);
} return *this;
} ~String()
{
if (--(*_refCount) == )
{
delete[] _pData;
delete _refCount;
}
}
// 返回值 函数名(参数)
char& operator[](int index)
{
// 检测返回
// *_refCount > 1
// *_refCount = 1
if (*_refCount > )
{
(*_refCount)--;
String temp(_pData);
_pData = temp._pData;
_refCount = temp._refCount;
(*_refCount)++;
}
return _pData[index];
}
/*const char& operator[](int index)const
{ return _pData[index];
}*/
private:
char* _pData;
int* _refCount;
};
}
void FunTest()
{
COW::String s1("");
COW::String s2("");
const COW::String s3 = s2;
s1 = s2;
s2[] = '';
//std::cout << s3[1];
}
int main()
{
FunTest();
return ;
}
浅拷贝&深拷贝&Copy On Write(Sring类)的更多相关文章
- [置顶] operator overloading(操作符重载,运算符重载)运算符重载,浅拷贝(logical copy) ,vs, 深拷贝(physical copy)
operator overloading(操作符重载,运算符重载) 所谓重载就是重新赋予新的意义,之前我们已经学过函数重载,函数重载的要求是函数名相同,函数的参数列表不同(个数或者参数类型).操作符重 ...
- 浅拷贝(Shallow Copy) VS 深拷贝(Deep Copy)
首先,深拷贝和浅拷贝针对的是对象类型(对象,数组,函数) 浅拷贝指的是只是拷贝了对象的引用地址,彼此之间高耦合,一个改变,另一个可能也随之改变: 深拷贝是指只是完整的将变量的值拷贝过来,是一个新的对象 ...
- copy&mutableCopy 浅拷贝(shallow copy)深拷贝 (deep copy)
写在前面 其实看了这么多,总结一个结论: 拷贝的初衷的目的就是为了:修改原来的对象不能影响到拷贝出来得对象 && 修改拷贝出来的对象也不能影响到原来的对象 所以,如果原来对象就是imm ...
- python中赋值-浅拷贝-深拷贝之间的关系
赋值: 变量的引用,没有拷贝空间 对象之间赋值本质上 是对象之间的引用传递而已.也就是多个对象指向同一个数据空间. 拷贝的对象分两种类型: . 拷贝可变类型 浅拷贝: 只拷贝第一层数据,不关心里面的第 ...
- Python__学习路上的坑之--引用,浅拷贝,深拷贝
copy : 相当于只是拷贝表面一层,如果里面还有深层次的引用,那么也是直接拷贝引用的地址,而且如果拷贝对象是不可变类型比如元组,那么也是直接拷贝引用. deepcopy: 无论是拷贝可变类型还是不可 ...
- python学习笔记七:浅拷贝深拷贝
原理 浅拷贝 import copy b = copy.copy(a) demo: >>> a=[1,['a']] >>> b=a >>> c=c ...
- Day 07 -02 拷贝 浅拷贝 深拷贝
必考 存一个值还是多个值 一个值:整型/浮点型/字符串 多个值:列表/元祖/字典/集合 有序or 无序 有序:字符串/列表/元祖 无序:字典/集合 可变or 不可变 可变:列表/字典/集合 不可变:整 ...
- JS中有关对象的继承以及实例化、浅拷贝深拷贝的奥秘
一.属性的归属问题 JS对象中定义的属性和方法如果不是挂在原型链上的方法和属性(直接通过如类似x的方式进行定义)都只是在该对象上,对原型链上的没有影响.对于所有实例共用的方法可直接定义在原型链上这样实 ...
- $.extend()浅拷贝深拷贝
参考网址:http://bijian1013.iteye.com/blog/2255037 jQuery.extend() 函数用于将一个或多个对象的内容合并到目标对象. 注意:1. 如果只为$.ex ...
随机推荐
- Eclipse build时间太长,无法忍受,完美解决方案,Eclipse 编译太卡,耗时太长
目前开发使用了Eclipse ,每次报错的时候都会build,,每次build的时间都很长,接近10秒左右,好难受呀.. 刚开始一直以为是项目内容多导致的,但是想想之前做的项目,无论再多,也都是秒级的 ...
- 【tp5.1】七牛云上传图片
composer安装: composer require qiniu/php-sdk 配置使用: 在tp5.1的配置文件app.php中配置七牛云的参数 'qiniu' => [ 'access ...
- 23.3.3 Web存储机制【JavaScript高级程序设计第三版】
Web Storage 最早是在Web 超文本应用技术工作组(WHAT-WG)的Web 应用1.0 规范中描述的. 这个规范的最初的工作最终成为了HTML5 的一部分.Web Storage 的目的是 ...
- ctf题目writeup(5)
2019.2.1 今天继续bugku的隐写杂项题:题目链接:https://ctf.bugku.com/challenges 1. 这道题下载后用wireshark打开...看了好久也没看出个所以然, ...
- 新手学习ARM,对片内ram、SDRAM、NOR FLASH和NAND FLASH启动这几个概念的理解
片内的ram用来存储启动代码,在2440初始化sdram之前,代码就在片内ram中运行.片内ram装载的是norflash中的内容,即u-boot. uboot放在norflash里,nandflas ...
- VC中编译出现error LNK2005:xx already defined in xxx.obj问题解决。
网上百度说是在.h头文件中定义了全局变量,然后其他文件包括了该头文件的原因. 解决方法如下: 点击项目配置->linker->General->Force file Output设置 ...
- Remote X11 GUI for Linux/Unix
摘自:https://www.redwireservices.com/remote-x11-for-linux-unix The Problem One of my most feared quest ...
- web端常见兼容性问题整理
一.html和css 各浏览器的默认内外边距不一致问题 最明显的是ul标签内外边距问题,ul标签在IE-7中,有个默认的外边距,但是在IE8以上及其他浏览器中有个默认的内边距. 解决办法:*{marg ...
- SVN 使用时的小错误
在使用SVN的时候总是出现一些小问题,今天又出现了一个,诶,分享一下吧! Error:(个人文件夹名http://www.qdjhu.com/anli_xq/f_wancheng.php) is ...
- Loadrunner11.0安装与简单使用
公司开发了APP或者微信小程序啊什么的,都会先进行性能测试,而性能测试一般肯定会来测试接口的压测,并发.Loadrunner是一个很强大的测试工具,它是一种预测系统行为和性能的负载测试工具.通过以模拟 ...