【String类浅拷贝的实现】C++:String类引用计数浅拷贝的两种实现
来源:互联网 发布:旅游购物 知乎 编辑:程序博客网 时间:2024/05/07 07:01
第一种:
只采用_str一个变量,利用强制转换前后偏移,获取存取计数的位置,以及存放字符串的位置。
#include<stdio.h>#include<stdlib.h>#include<iostream>using namespace std;class String{public: String(char* str = "") :_str(new char[strlen(str) + 5]) { *(int*)_str = 1; _str += 4; strcpy(_str, str); } String(const String& s) :_str(s._str) { ++(*(int*)(_str - 4)); } //重载= String& operator= (const String& s) { if (s._str != _str) { Release(); _str = s._str; } return *this; } //重载[] char& operator[] (size_t index) { if (GetRefCount(_str) >1) { char* tmp = new char[strlen(_str) + 5]; tmp += 4; GetRefCount(tmp) = 1; strcpy(tmp, _str); --(GetRefCount(_str)); _str = tmp; } return _str[index]; } ~String() { Release(); }void Release(){ if (*(int*)(_str) == 0) { delete[] (_str - 4);//指针返回首地址位置,释放整段空间 }}int& GetRefCount(char* str){ return *(int*)(_str - 4);}private: char* _str;};void Test(){ String s1("xxxxxxxxxxxxxx"); String s2(s1); s2 = s1; String s3("yyyyyyy"); String s4(s3); s4 = s3; s3 = s1; s3[0] = 'S';}int main(){ Test(); system("pause"); return 0;}
第二种:
采用_str以及_pRefCount两个变量。
#include<stdio.h>#include<iostream>#include<stdlib.h>#include<assert.h>using namespace std;class String{public: String(char* str = "") :_str(new char[strlen(str) + 1]) , _pRefCount(new int(1)) { strcpy(_str, str); } String(String& s) :_str(s._str) , _pRefCount(s._pRefCount) { ++(*_pRefCount); } String& operator=(const String& s) { /*if(_str != s.str) { if (--(*_pRefCount) == 0) { delete[] _str; delete _pRefCount; } _str = s._str; _pRefCount = s._pRefCount; ++(*_pRefCount); } return *this;*/ if (_str != s._str) { if (--(*_pRefCount) == 0) { Release(); } _str = s._str; _pRefCount = s._pRefCount; ++(*_pRefCount); } return *this; } ~String() { /*if (--(*_pRefCount) == 0) { delete[] _str; delete _pRefCount; }*/ Release(); }void Release(){ if (--(*_pRefCount) == 0) { delete[] _str; delete _pRefCount; }}//与测试函数2对应int GetRefCount(){ return (*_pRefCount);}private: int* _pRefCount; char* _str;};//测试函数1:监视查看//void Test()//{// String s1("xxxxxxxxxxxxxxxxx");// String s2(s1);// s2 = s1;//// String s3("yyyyyyyyyyyyy");// String s4(s3);//// s1 = s3;//}//测试函数2:手动书写函数GetRefCount返回引用计数,断言方法判断是否一致void Test(){ String s1("xxxxxxxxxxxxxxxxx"); String s2(s1); s2 = s1; assert(s1.GetRefCount() == 2); assert(s2.GetRefCount() == 2); String s3("yyyyyyyyyyyyy"); String s4(s3); s1 = s3; assert(s1.GetRefCount() == 3); assert(s2.GetRefCount() == 1); assert(s3.GetRefCount() == 3); assert(s4.GetRefCount() == 3);}int main(){ Test(); system("pause"); return 0;}
本文出自 “Han Jing's Blog” 博客,请务必保留此出处http://10740184.blog.51cto.com/10730184/1745771
0 0
- 【String类浅拷贝的实现】C++:String类引用计数浅拷贝的两种实现
- String类引用计数的浅拷贝
- String类的浅拷贝、深拷贝、引用计数、写时拷贝
- String类的引用计数的浅拷贝
- 【C++】String类拷贝构造函数——浅拷贝优化的三种方式(引用计数)
- 小结 | C++ String类的引用计数的浅拷贝、写时拷贝
- string类的简单实现(深拷贝,浅拷贝)
- String类的实现(深拷贝or浅拷贝)
- String浅拷贝---引用计数
- C++【常见面试题】String类的实现,以及深拷贝、浅拷贝问题
- 【C++】浅拷贝和深拷贝以及怎样实现一个简单的string类!!!
- string类的引用计数的写时拷贝分析
- string类的写时拷贝与引用计数
- String类引用计数的写时拷贝
- string类的写时拷贝与引用计数
- String类详解(浅拷贝,深拷贝,引用计数,写时拷贝)
- 关于String类浅拷贝引用计数问题
- String类的浅拷贝,深拷贝
- c语言:【顺序表】静态顺序表的删除指定位置元素Erase、删除指定元素Remove
- Oracle去掉重复数据
- C语言:【动态顺序表】动态顺序表的初始化、打印、尾插PushBack、尾删PopBack
- C语言:【动态顺序表】动态顺序表的在指定位置插入元素Insert,以及指定元素Find
- 【C语言项目】注释转换
- 【String类浅拷贝的实现】C++:String类引用计数浅拷贝的两种实现
- 【String类】C++:String类的传统写法与现代写法
- 《剑指offer》字符串中的字符替换
- 【C++】实现动态顺序表的PushBack(),PopBack(),PushFront(),PopFront(),Find(),Insert
- 【C++】用类实现单向单链表的尾插PushBack(),尾删PopBack(),打印PrintSlist()。
- 【C++】实现双向链表的所有操作,包括逆置双链表(三种方法)
- 【C语言】单链表的所有操作的实现(包括PopBack、PushBack、PopFront、PushFront、Insert)
- 【继承与多态】C++:继承中的赋值兼容规则,子类的成员函数,虚函数(重写),多态
- 【C++】模版类实现普通类静态顺序表