C++深浅拷贝——实现String类
来源:互联网 发布:做淘宝代销什么好 编辑:程序博客网 时间:2024/05/30 05:18
浅拷贝:也称位拷贝,编译器只是直接将指针的值拷贝过来,结果多个对象共用同一块内存,当一个对象将这块内存释放掉之后,另一些对象不知道该块空间已经还给了系统,以为还有效,所以在对这段内存进行操作的时候,发生了访问违规。
当类里面有指针对象时,拷贝构造和赋值运算符重载只进行值拷贝(浅拷贝),两个对象向同一块内存,对象销毁时该空间被释放了两次,因此程序崩溃!
深拷贝:为不同的指针对象各自开辟空间。
浅拷贝实现String类:(错误版)
class String{public:String(const char *str = NULL);String(const String &other);String& operator = (const String &other);~String();private:char *m_data;};String::String(const char *str){if(str == NULL){m_data = new char[1];*m_data = '\0';}else{int length = strlen(str);m_data = new char[length+1];strcpy(m_data, str);}}String::String(const String &other){strcpy(m_data, other.m_data);}String & String::operator =(const String &other){ //检查自赋值if(this == &other){return *this; }int length = strlen(other.m_data);m_data = new char[length+1];strcpy(m_data, other.m_data);//返回当前对象的引用return *this;}String::~String(){delete[] m_data;m_data = NULL;}int main(){String s;String s1 = "1111";String s4 = "33333";String s5 = "444444";String s6 = "666";String s2(s1);String s3 = "22222";String s7;String s8("hello world!");s1 = s3;system("pause");return 0;}
拷贝构造函数:
赋值运算符的重载:
运行结果:
深拷贝:(普通版)
class String{public:String(const char *str = NULL);String(const String &other);String& operator = (const String &other);~String();private:char *m_data;};String::String(const char *str){if(str == NULL){m_data = new char[1];*m_data = '\0';}else{int length = strlen(str);m_data = new char[length+1];strcpy(m_data, str);}}String::String(const String &other){int length = strlen(other.m_data);m_data = new char[length+1];strcpy(m_data, other.m_data);}String & String::operator =(const String &other){ 检查自赋值if(this == &other){return *this; }释放原有的内存资源delete[] m_data;分配新的内存资源,并复制内容int length = strlen(other.m_data);m_data = new char[length+1];strcpy(m_data, other.m_data);返回当前对象的引用return *this;}String::~String(){delete[] m_data;m_data = NULL;}int main(){String s;String s1 = "1111";String s4 = "33333";String s5 = "444444";String s6 = "666";String s2(s1);String s3 = "22222";String s7;String s8("hello world!");s1 = s3;system("pause");return 0;}
浅拷贝:(引用计数版)//浅拷贝:引用计数版class String{public:String(char *pStr = ""):_pCount(new int(1)){if(NULL == *pStr){pStr = new char[1];*pStr = '\0';}else{_pStr = new char[strlen(pStr)+1];strcpy(_pStr,pStr);}}String(const String& s):_pStr(s._pStr),_pCount(s._pCount){++(*_pCount);}String& operator = (const String& s){if(--(*_pCount) == 0 && _pStr){delete[] _pStr;delete _pCount;}_pStr = s._pStr;_pCount = s._pCount;++(*_pCount);return *this;}~String(){if(--(*_pCount) == 0){delete[] _pStr;delete _pCount;_pStr = NULL;_pCount = NULL;}}private:char* _pStr;int* _pCount;};
0 0
- C++深浅拷贝——实现String类
- C++String深浅拷贝
- C++String深浅拷贝问题
- c++-----string和深浅拷贝
- C++String深浅拷贝、写时拷贝
- String类与深浅拷贝
- 深浅拷贝(String类)
- String类的实现与深浅拷贝问题
- string类的深浅拷贝问题
- string--深浅拷贝
- ios学习路线—Objective-C(深浅拷贝)
- C++—string类写实拷贝的实现
- Objective-c 深浅拷贝
- 【C++】 浅析深浅拷贝
- 模拟实现string(深浅拷贝,传统现代写法)
- c#实现深浅拷贝
- 【面试题一】:string类的深浅拷贝
- python——赋值与深浅拷贝
- 划分硬盘分区
- [Android]dump调用
- ACM 括号配对问题 (Java)
- 正则表达式30分钟入门教程
- 文章标题
- C++深浅拷贝——实现String类
- SpringBoot学习(一) — 我的第一个SpringBoot工程
- Java 操作符
- 不错的Unity教程
- bluetooth 蓝牙开发 打印小票
- 图解Https
- 2016-2017 ACM-ICPC Northeastern European Regional Contest (NEERC 16) Gym
- jQuery事件之鼠标事件
- 辅助线——hdfs 存储