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);} };
下面是下标运算符的实例:
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类相关推荐
- AJPFX学习笔记JavaAPI之String类
学习笔记JavaAPI之String类 [size=10.5000pt]一.所属包java.lang.String,没有子类.特点:一旦被初始化就不可以被改变. 创建类对象的两种方式: String ...
- Coding之路——重新学习C++(2):static的详细理解
一.C中的static关键字 1. static 局部变量 静态局部变量属于静态存储方式,它具有以下特点: (1)静态局部变量 在函数内定义它的生存期为 整个程序生命周期,但是其 作用域仍与 自动变 ...
- Java学习之设计一个汽车类Auto,其中包含一个表示速度的double型成员变量speed和表示启动的start()方法、表示加速的speedUp()方法以及表示停止的stop()方法。
案例介绍: 请设计一个汽车类Auto,其中包含一个表示速度的double刑的成员恋量speed,表示启动的start()方法.表示加速的speedUp()方法以及表示停止的 stop()方法.再设计一 ...
- Java中字符串的学习(一)String类的概述及常见方法使用
转载请注明出处http://www.cnblogs.com/devtrees/p/4347079.html (拓展:Api:编程语言对外给我们提供的应用程序接口.) 一.概述: 我们平时上网发帖,帖子 ...
- java中String类是什么_Java中字符串的学习(一)String类的概述及常见方法使用
转载请注明出处http://www.cnblogs.com/devtrees/p/4347079.html (拓展:Api:编程语言对外给我们提供的应用程序接口.) 一.概述: 我们平时上网发帖,帖子 ...
- Java学习记录(补充三:String类)
String类的基本概念package day6;import java.util.Arrays;public class Demo02 { public static void main(Strin ...
- Java学习笔记20(String类应用、StringBuffer类、StringBuilder类)
1.获取指定字符串中大小写和数字的个数: package demo;public class StringTest {public static void main(String[] args) {g ...
- C++ Primer Plus学习(四)—— string类实践
string类实践 #include <iostream> #include <string> #include <sstream> #include <al ...
- C++学习之路(六):实现一个String类
直接贴代码吧,这段时间准备面试也正好练习了一下. class String { public:String(const char *str = "");~String(void); ...
最新文章
- C++ 枚举类型介绍
- winphone系统a、input标签被点击时产生的半透明灰色背景
- oracle怎么才能成功安装,一、oracle数据库成功安装步骤 (11gR2)
- 拷贝构造函数的调用以及浅拷贝与深拷贝的理解
- minicap_工具使用
- Web基础:记录简单个人网站建站过程
- How is application controller loaded by UI5 framework
- 最近发现系统rabbitmq丢消息比较严重,于是想了些方案来查找原因,给将消息发送方式添加确认机制。 我们在本地模拟了wms发送打标消息的场景. 1. 有事务 2. 先发点对点队列, 再发订
- Linux logo和屏幕光标
- 重磅!2020中国高校毕业生月薪排名:清华第1,24高校过万,你呢?
- C# Oracle.DataAccess.dll 版本错误链接不上数据库
- c语言链表的数据结构,c语言实现通用数据结构(一):通用链表
- ubuntu 下 4412烧写SuperBoot
- java fckeditor下载_FCKEditor的使用
- 微信公众号首次关注自动回复图文信息
- android仿今日头条App、多种漂亮加载效果、选择器汇总、记事本App、Kotlin开发等源码
- “本人成分” 如何填写
- 经过负载均衡图片加载不出来_负载均衡基础知识
- Drawio免费绘图工具
- 0xC0000005: 写入位置 0x00000000 时发生访问冲突的解决办法
热门文章
- 安卓http服务器源码,Android搭建HTTP和WebSocket的服务器端
- mysql 2100_mysql增量备份与恢复实战
- 【NOI OpenJudge】【1.2】编程基础之变量定义、赋值及转换
- matlab矩阵元素绝对值,如何解决矩阵内部元素绝对值化
- JAVA面向对象OOP→构造方法、this、访问修饰符、static、方法重载、JVM内存分配、GC垃圾回收、包、样例代码
- JavaScript浏览器对象模型常用事件(2)
- c++ 调用python_闲话python 48: C/C++扩展Python与Swig工具
- HDU-2473 Junk-Mail Filter(并查集的使用)
- bzoj 2326: [HNOI2011]数学作业(矩阵快速幂)
- opencv 模板匹配,在图像中寻找物体