首页 > 代码库 > Coding之路——重新学习C++(6):一个String类
Coding之路——重新学习C++(6):一个String类
这个String类是对运算符重载和以前知识的一个综合应用,提供了值语义、字符串读写、检查和不检查的访问、流I/O和字符串拼接等功能。
1.String类的定义
class String{ //类型的定义 struct Srep; //表示能被几个同样值的String共享 Srep *rep;public: class Cref; //实现下标运算,区别对待读操作和写操作 class Range(); //范围错误时抛出的异常 //构造、赋值和析构函数 String(); //x = ""; String(const char*); //x ="abc"; String(const String&); //x = other_string; String& operator=(const char*); String& operator=(const String&); ~String(); //带检查的访问运算符 void check(int i) const{if(i < 0 || rep->sz < i) throw Range();} char read(int i) const{return rep->s[i];} void write(int i, char c){ rep = rep->get_own_copy(); rep->s[i] =c; } Cref operator[](int i){ check(i); return Cref(*this, i); } char operator[](int i) const{ check(i); return rep->s[i]; } int size() const{return rep->sz;} //其他String操作 String& operator+=(const String&); String& operator+=(const char*); friend ostream& operator<<(ostream&, const String&); friend istream& operator>>(ostream&, String&); friend bool operator==(const String& x, const char *s){ return strcmp(x.rep->s, s)==0; } friend bool operator==(const String& x, const String& y){ return strcmp(x.rep->s, y.rep->s)==0; }};String operator+(const String&, const String&);String operator+(const String&, const char*);String operator+(const char*, const String&);
2.Srep类:实现同样值的String类的共享
struct String::Srep{ char *s; //到元素的指针 int sz; //字符个数 int n; //引用计数 Srep(int nsz, const char *p){ n = 1; sz = nsz; s = new char[sz + 1]; strcpy(s, p); } ~Srep(){ delete s; } Srep* get_own_copy(){ //实现写时复制。 if(n == 1) return this; n--; return new Srep(sz, s); } void assign(int nsz, const char* p){ if(sz != nsz){ delete []s; sz = nsz; s = new char[sz + 1]; } strcpy(s, p); }private: Srep(const Srep&); Srep& operator=(const Srep&);};
3.String的复制实现
String::String(){ //空串为默认值 rep = new Srep(0, "");}String::String(const String& x){ //拷贝构造函数 x.rep->n++; rep = x.rep;}String::~String(){ //析构函数 if(--n == 0) delete rep;}String& operator=(const String& x){ //复制赋值 x.rep->n++; if(--n == 0) delete rep; rep = x.rep; return *this;}String::String(const char *s){ rep = new Srep(strlen(s), s);}String& operator=(const char *s){ //复制赋值 if(rep->n == 1) rep->assign(strlen(s), s); else{ rep->n--; rep = new Srep(strlen(s), s); } return *this;}
4.实现读和写的Cref
class String::Cref{ friend class String; String &s; int i; Cref(String &ss, int ii):s(ss), i(ii){}public: operator char() const{ return s.read(i);} void operator=(char c){s.write(i, c);}};
Coding之路——重新学习C++(6):一个String类
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。