C++::实现String类的写时拷贝形式 - 高小调博客

C++::实现String类的写时拷贝形式

String引用计数版,极大的提高了程序的性能,节省了内存.但也存在着致命的问题.

本文对String引用计数版本,再次优化,彻底解决修改一个串,所有串被修改的尴尬.

写时拷贝

写时拷贝,顾名思义,就是在对字符串即将进行写入操作时,把它重新拷贝一份,然后新的内容写入拷贝的那一份.

我总觉得语言永远是晦涩难懂的,所以不再多说一句废话,直接贴代码.

(Talk is cheap,Show you my code)

/*
*本代码版权归高小调博客所有 
*作者:最近头比较大,不知道怎么有效学习C++的高小调
*日期:2016-10-21
*代码功能:String类的写时拷贝版本 
*/
#include<iostream>
#include<assert.h>
class String{
public:
	//构造函数,默认初始化为空串
	String(const char *pStr = ""){
		//防止String s(NULL);
		if(NULL != pStr){
			//pStr不为空时,开辟一段内存
			//多申请4个字节用来存储当前共享pStr指针对象的个数
			_pStr = new char[strlen(pStr)+1+4];
			//将前4个字节的内容赋值为1
			*((int *)_pStr) = 1;
			//_pStr向后偏移4个字节,偏移到字符串域
			_pStr += 4;
			//将源字符串拷贝过去
			strcpy(_pStr,pStr);
		}else{
			//pStr为空时,开辟5个字节,前四个字节存储对象个数
			_pStr = new char[5];
			//将前4个字节的内容赋值为1
			*((int *)_pStr) = 1;
			//_pStr向后偏移4个字节,偏移到字符串域
			_pStr += 4;
			*_pStr = '\0';
		}
	}
	//拷贝构造函数,将_pStr初始化为被拷贝对象的pStr指针
	String(String &s)
		:_pStr(s._pStr){
		//计数器加1
		++(*((int *)(_pStr-4)));

	}
	//赋值运算符重载
	String &operator=(const String &s){
		//判断是否自身给自身赋值
		if(this!=&s){
			//如果this对象的计数器减一后为0
			if(0 == --(*((int *)(_pStr-4)))){
				//释放this对象的pStr
				delete (_pStr-4);
			}
			//_pStr指向新区域,且计数器加1
			_pStr = s._pStr;
			++(*((int *)(_pStr-4)));
		}
		return *this;
	}
	//下标运算符重载
	char & operator[](size_t index){
		//参数检测
		int length = 0;
		if(index>(length=strlen(_pStr))){
			assert(false);
		}
		//判断this对象的pStr指针,是否被其他人共享
		if( (*((int *)(_pStr-4))) >1){
			//开辟新空间,计数器赋值为1,pTemp向后偏移,拷贝源字符串
			char *pTemp = new char[length+1+4];
			*((int *)pTemp) = 1;
			pTemp += 4;
			strcpy(pTemp,_pStr);
			//this对象计数器减一
			--(*((int *)(_pStr-4)));
			//改变pStr指向
			_pStr = pTemp;
		}
		return *_pStr;
	}
	//析构函数
	~String(){
		//如果this对象的计数器减一后为0
		if(0 == --(*((int *)(_pStr-4)))){
			//释放this对象的pStr
			delete (_pStr-4);
			_pStr = NULL;
		}
	}
private:
	char *_pStr;
};
int main(){
	String s1("Hello");	/
	String s2(s1);		
	String s3;		
	s3 = s2;
	s3[0]='L';
	return 0;
}

所以...机智的读者已经发现了,相对于String引用计数来说,仅仅是多了一个下标运算符重载.

在这里,推荐一篇文章,比我讲的更加详细:

ps:没有人评论,好忧伤...

暂无标签
上一篇:
下一篇: