这个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);}
};

下面是下标运算符的实例:

void f(String &s, const String &r){char c1 = s[1];     //c1 = s.operator[](1).operator char()s[1] = 'c';             //s.operator[](1).operator=('c')char c2 = r[1];     //c2 = r.operator[](1)r[1] = 'd';             //错误:给const赋值,r.operator[](1) = 'd'
}

    

转载于:https://www.cnblogs.com/xskCoder/p/3998076.html

Coding之路——重新学习C++(6):一个String类相关推荐

  1. AJPFX学习笔记JavaAPI之String类

    学习笔记JavaAPI之String类 [size=10.5000pt]一.所属包java.lang.String,没有子类.特点:一旦被初始化就不可以被改变. 创建类对象的两种方式: String ...

  2. Coding之路——重新学习C++(2):static的详细理解

    一.C中的static关键字 1. static 局部变量 静态局部变量属于静态存储方式,它具有以下特点:  (1)静态局部变量 在函数内定义它的生存期为 整个程序生命周期,但是其 作用域仍与 自动变 ...

  3. Java学习之设计一个汽车类Auto,其中包含一个表示速度的double型成员变量speed和表示启动的start()方法、表示加速的speedUp()方法以及表示停止的stop()方法。

    案例介绍: 请设计一个汽车类Auto,其中包含一个表示速度的double刑的成员恋量speed,表示启动的start()方法.表示加速的speedUp()方法以及表示停止的 stop()方法.再设计一 ...

  4. Java中字符串的学习(一)String类的概述及常见方法使用

    转载请注明出处http://www.cnblogs.com/devtrees/p/4347079.html (拓展:Api:编程语言对外给我们提供的应用程序接口.) 一.概述: 我们平时上网发帖,帖子 ...

  5. java中String类是什么_Java中字符串的学习(一)String类的概述及常见方法使用

    转载请注明出处http://www.cnblogs.com/devtrees/p/4347079.html (拓展:Api:编程语言对外给我们提供的应用程序接口.) 一.概述: 我们平时上网发帖,帖子 ...

  6. Java学习记录(补充三:String类)

    String类的基本概念package day6;import java.util.Arrays;public class Demo02 { public static void main(Strin ...

  7. Java学习笔记20(String类应用、StringBuffer类、StringBuilder类)

    1.获取指定字符串中大小写和数字的个数: package demo;public class StringTest {public static void main(String[] args) {g ...

  8. C++ Primer Plus学习(四)—— string类实践

    string类实践 #include <iostream> #include <string> #include <sstream> #include <al ...

  9. C++学习之路(六):实现一个String类

    直接贴代码吧,这段时间准备面试也正好练习了一下. class String { public:String(const char *str = "");~String(void); ...

最新文章

  1. C++ 枚举类型介绍
  2. winphone系统a、input标签被点击时产生的半透明灰色背景
  3. oracle怎么才能成功安装,一、oracle数据库成功安装步骤 (11gR2)
  4. 拷贝构造函数的调用以及浅拷贝与深拷贝的理解
  5. minicap_工具使用
  6. Web基础:记录简单个人网站建站过程
  7. How is application controller loaded by UI5 framework
  8. 最近发现系统rabbitmq丢消息比较严重,于是想了些方案来查找原因,给将消息发送方式添加确认机制。 我们在本地模拟了wms发送打标消息的场景. 1. 有事务 2. 先发点对点队列, 再发订
  9. Linux logo和屏幕光标
  10. 重磅!2020中国高校毕业生月薪排名:清华第1,24高校过万,你呢?
  11. C# Oracle.DataAccess.dll 版本错误链接不上数据库
  12. c语言链表的数据结构,c语言实现通用数据结构(一):通用链表
  13. ubuntu 下 4412烧写SuperBoot
  14. java fckeditor下载_FCKEditor的使用
  15. 微信公众号首次关注自动回复图文信息
  16. android仿今日头条App、多种漂亮加载效果、选择器汇总、记事本App、Kotlin开发等源码
  17. “本人成分” 如何填写
  18. 经过负载均衡图片加载不出来_负载均衡基础知识
  19. Drawio免费绘图工具
  20. 0xC0000005: 写入位置 0x00000000 时发生访问冲突的解决办法

热门文章

  1. 安卓http服务器源码,Android搭建HTTP和WebSocket的服务器端
  2. mysql 2100_mysql增量备份与恢复实战
  3. 【NOI OpenJudge】【1.2】编程基础之变量定义、赋值及转换
  4. matlab矩阵元素绝对值,如何解决矩阵内部元素绝对值化
  5. JAVA面向对象OOP→构造方法、this、访问修饰符、static、方法重载、JVM内存分配、GC垃圾回收、包、样例代码
  6. JavaScript浏览器对象模型常用事件(2)
  7. c++ 调用python_闲话python 48: C/C++扩展Python与Swig工具
  8. HDU-2473 Junk-Mail Filter(并查集的使用)
  9. bzoj 2326: [HNOI2011]数学作业(矩阵快速幂)
  10. opencv 模板匹配,在图像中寻找物体