模拟实现String类
来源:互联网 发布:电视机网络电视怎么调 编辑:程序博客网 时间:2024/06/06 09:00
String类模拟实现:
#include <iostream>#include <assert.h>#include <string.h>using namespace std;class String{public: String(char* str = "") { _size = strlen(str); _str = new char[_size+1]; strcpy(_str,str); } String(const String& str) { _size = strlen(str._str); _str = new char[_size+1]; strcpy(_str,str._str); } String& operator=(const String& str) { String tmp(str._str); char* p = tmp._str; tmp._str = _str; _str = p; _size = tmp._size; return *this; } ~String() { if (_str) { delete[] _str; _size = 0; } } void DisPlay() { cout<<_str<<"->"<<_size<<endl; } size_t Size()const//返回对象 { return _size; } char& operator[](size_t index) { assert(index<_size); return _str[index-1]; } String operator+(const String& s) { char* p = new char[strlen(_str)+strlen(s._str)+1]; strcpy(p,_str); strcat(p,s._str); String tmp(p); delete p; return tmp; } bool operator>(const String& s) { char* p1 = _str; char* p2 = s._str; while ((*p1 == *p2)&&(*p1 != '\0')&&(*p2 != '\0')) { *p1++; *p2++; } if ((*p1 - *p2)>0) { return 1; } return 0; } bool operator<(const String& s) { char* p2 = _str; char* p1 = s._str; while ((*p1 == *p2)&&(*p1 != '\0')&&(*p2 != '\0')) { *p1++; *p2++; } if ((*p1 - *p2)>0) { return 1; } return 0; } bool operator==(const String& s) { char* p2 = _str; char* p1 = s._str; while ((*p1 == *p2)&&(*p1 != '\0')&&(*p2 != '\0')) { *p1++; *p2++; } if ((*p1 == '\0')&&(*p2 == '\0')) { return 1; } return 0; } bool operator!=(const String& s) { char* p2 = _str; char* p1 = s._str; while ((*p1 == *p2)&&(*p1 != '\0')&&(*p2 != '\0')) { *p1++; *p2++; } if ((*p1 == '\0')&&(*p2 == '\0')) { return 0; } return 1; } const char* C_Str()const//返回类中的字符串 { return _str; } String SubStr(size_t pos, size_t n)//返回一个对象的子串对象 { char* p = new char[n+1]; strncpy(p,_str+pos-1,n); p[n]='\0'; String tmp(p); delete p; return tmp; }protected:private: char* _str; size_t _size;};
测试代码:
void Test1()//测试构造,拷贝构造,复制重载{ String str("hello "); str.DisPlay(); String str1(str); str1.DisPlay(); String str2 = str1; str2.DisPlay();}void Test2()//测试下标运算符[],和加法运算符+的重载{ String str("hello "); String str1("world "); String str2("private"); str2 = str + str1; str2.DisPlay(); cout<<str[2]<<endl;}void Test3()//测试关系运算符 >, <, ==, !=, 的重载{ String str("hello "); String str1("world "); String str2("hello "); if (str > str1) { cout<<"str 大于 str1"<<endl; } else { cout<<"str 不大于 str1"<<endl; } if (str < str1) { cout<<"str 小于 str1"<<endl; } else { cout<<"str 不小于 str1"<<endl; } if (str == str2) { cout<<"str 等于 str2"<<endl; } else { cout<<"str 不等于 str2"<<endl; } if (str1 != str2) { cout<<"str 不等于 str2"<<endl; } else { cout<<"str 等于 str2"<<endl; }}void Test4(){ String str("hello "); String str1("world "); const char * pstr = str1.C_Str(); cout<<pstr<<endl; str1 = str.SubStr(2,4); str1.DisPlay();}int main(){ Test1(); Test2(); Test3(); Test4(); return 0;}
浅拷贝和深拷贝
在某些状况下,类内成员变量需要动态开辟堆内存,如果实行位拷贝,也就是把对象里的值完全复制给另一个对象,如A=B。这时,如果B中有一个成员变量指针已经申请了内存,那A中的那个成员变量也指向同一块内存。这就出现了问题:当B把内存释放了(如:析构),这时A内的指针就是野指针了,出现运行错误。
深拷贝:
在进行拷贝的过程中,新开辟一块空间,然后将要拷贝的内容放到新开辟的空间里,
对另一个对象进行赋值时,要根据赋值对象,对被赋值对象的空间进行调整,这时候就要用到深拷贝。
阅读全文
0 0
- 模拟实现string类
- 模拟实现string类
- 模拟实现 string类
- 模拟实现string类
- 模拟实现string类
- 模拟实现string类
- 模拟实现string类
- 模拟实现String类
- C++:模拟实现string类
- String 类的模拟实现
- 模拟实现string类(c++)
- 【C++】模拟实现String类
- 模拟实现String类----传统写法
- 模拟实现String类--->现代写法
- 模拟实现String类---->写时拷贝
- 模拟实现C++中的string类
- String类深拷贝的模拟实现
- 简单的string类的模拟实现
- Hibernate第六课--1+N问题和缓存
- 170722 逆向-DLL基础
- Hibernate第七课--事务,悲观锁,乐观锁
- 也谈测试用例的设计
- sysctl命令详解
- 模拟实现String类
- Linux之进程管理
- Java虚拟机内存分区域与内存溢出异常
- Hibernate删除,添加问题
- MariaDB
- PHP魔术方法
- HIbernate多对多_查询
- 求二叉树叶子节点的个数/求二叉树第k层的节点个数/一个数组中有一个数字的次数超过了数组的一半,求出这个字符
- 【bzoj1529】 [POI2005]ska Piggy banks