当前位置: 首页 > news >正文

10.string(下)

看一下非成员函数,

+为什么是非成员函数

就是说之前日期类加整形,重载成全局的就可以整形加日期类,因为运算符重载只要求有一个是类类型参数就可以

看一下getline 

区间减左闭右开就是个数

cin  scanf 拿不到空格,遇到空格停了。有可能输入多个字符串,默认空格,换行分割,这些空格  换行都在缓冲区,再写一个string  提取的也不是空格,提取的是T,因为它认为空格是这块分割,

字符串有空格,就不能用这个东西,

getline遇到换行才停止,可以自己定义终止符

可以一直换行,直到遇到*

接下来看看string 底层

这么写不行,不是按初始化列表顺序是按声明顺序,先初始化——str,_size是随机值。

这个不适合初始化列表初始化,之前说建议初始化列表初始化并不是所有都可以,我们不写初始化列表,他也会走一遍,只是说内置类型有可能初始化有可能不初始化,不影响,所以在构造函数内实现,capacity不包含\0,size不加1

暂且先不声明定义分离

我们这里用namespace 为了和库里面string 分离,

类里面默认内联,不会进符号表, 类外定义的话  在  string 。cpp 和text.cpp都包含h,那么各自都有一份,链接时候有两份就冲突了,方法

达到效果类似,内联是展开,在当前文件可见,不进符号表,最标准的写法:定义和声明分离

两个文件都包含声明是没问题的,

程序崩溃了是·s1是空的string对象,使用空指针初始化的,char*空指针打印不会按空指针打印 ,char*认为是字符串,直接进行解引用以\0终止,出现空指针解引用,报错,,,,这种写法可随时切换成库的

库里不报错,说明这样写空的_str是不行的

实践当中能不能把他两合并一下  全缺省,但是全缺省不能缺省空,strlen 空又崩了

这个严格来说是两个\0了

这样就是\0了,常量字符串后面都有\0, strlen是0, 空间开了1个,strcy是把\0都拷贝过去,他是先拷贝再判断,遇到\0就结束,啥都没有,就把\0拷贝过去
接下来做一下声明定义分离,短小频繁调用的函数放到类里,默认内联

这几个 也都是短小精悍的
现在进行遍历

自己这个东西支不支持范围for遍历

不支持,范围for底层就是替换成迭代器,

实现迭代器,在有些场景下也会有缺陷,这不就是迭代器,我有一个类型,这个类型在类域里面,迭代器模拟的是指针的行为

迭代器遍历就好了,范围for 也好了,就是编译器替换成迭代器

这些iteratoar全是typedef来的,typedef加类域就很爽, 统一了类型,不关心底层         

string 底层是数组所以才能用原生指针做迭代器  1.连续  2.。 解引用是值,链表就不行

迭代器设计也是一种封装的体现

底层可能是链表  可能是数组  数,我都用iterator,东西,属于类域,是什么不知道,封装之后你给我提供begin ()end指向数据下一个位置,取数据就解引用,到下一位置就++,屏蔽了底层实现细节,提供了统一的方式访问,不需要关心这个数据结构是什么, 对不同类型数据用类似方式去访问像是支付宝把各个银行封装起来了

范围for去替换时候必须原模原样按库里面命名风格走Bgein就不能替换了 

还有const迭代器

pushback开始就声明和定义分离,其他短小频繁地放类里内联,


string.cpp
#include"string.h"namespace bit
{const size_t string::npos = -1;void string::reserve(size_t n){if (n > _capacity){//cout << "reserve:" << n << endl;char* tmp = new char[n + 1];strcpy(tmp, _str);delete[] _str;_str = tmp;_capacity = n;}}void string::push_back(char ch){if (_size == _capacity){reserve(_capacity == 0 ? 4 : _capacity * 2);}_str[_size] = ch;++_size;_str[_size] = '\0';}string& string::operator+=(char ch){push_back(ch);return *this;}

运行一下

这里不建议用strcat 因为strcat默认要自己找\0,找到之后在\0后面再追加

全局的函数或者变量都不行

这个定义放到cpp

npos可以直接这样初始化,之前讲的静态不走初始化列表,不给缺省,但是这个可以,相当定义了,很怪,核心原因因为这个const, static const才行,const 认为这个值不改变可以直接诶这样给

double 都不行, 专门给静态 const开了个绿灯,方便定义一个整形的const常量,

void string::insert(size_t pos, char ch){assert(pos <= _size);if (_size == _capacity){reserve(_capacity == 0 ? 4 : _capacity * 2);}// 挪动数据size_t end = _size + 1;while (end > pos){_str[end] = _str[end - 1];--end;}_str[pos] = ch;++_size;}

http://www.dtcms.com/a/558615.html

相关文章:

  • 广东省建设监理协会信息管理网站wordpress 作者简介
  • tv电视盒子企业网站模板外贸网站的特色
  • 中国石油大学网页设计与网站建设免费做字体的网站
  • 解码LVGL基础
  • 延庆长沙网站建设综合服务门户网站建设
  • AOI在风电行业制造领域中的应用
  • 保健品网站dede模板网站制作咨询公司
  • oracl19c创建不带C##用户
  • 公司做网站如何跟客户介绍wordpress适合做商城吗
  • 商用网站开发计划书wordpress 技巧
  • 广州做网站制作网站建设笔记
  • 手机网站欢迎页面设计东莞建网站哪家强
  • 做网站需要多少钱卖片可以吗网站图片被盗连怎么办啊
  • 网站域名快速备案外贸网站建设公司
  • 网站建站域名解析最后做wordpress淘宝插件
  • 做自己的网站有什么用襄樊最好网站建设价格
  • DSBridge:在原生 WebView 中实现企业级 H5 ↔ Native 通信(支持异步 / 多次回调 / 命名空间)
  • win7 网站配置缅甸新闻最新消息
  • 学习FreeRTOS(软件定时器)
  • 网站索引量下降天津网站建设优化企业
  • 招牌做的好的网站上海app开发定制
  • 重庆建站公司价钱护肤品网站优化案例
  • Prometheus实战教程 03 - 主机监控
  • 建行网站查询密码是什么东西江门关键词优化公司
  • 开源企业网站建设系统中小企业有哪些公司
  • 金融投资网站方案精湛的中山网站建设
  • 人工智能训练师——2.1.1题解
  • 大学生网页设计与制作模板seo顾问服务福建
  • JavaScript 错误处理:全面解析与高效解决方案
  • 网站开发的广告国网商旅网页地址