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

江苏中星建设集团网站网站一元空间有哪些呀

江苏中星建设集团网站,网站一元空间有哪些呀,淮安网站网页设计,好大夫王建设在线个人网站文章目录 一. string底层逻辑演示声明和定义分开 二. size()三. operator[]四. 迭代器四. const迭代器五. 预留空间(reserve)六. 尾插一个字符push_back七. 尾插一个字符串append八. operator九. operator 一. string底层逻辑 (1)为了和库里面…

文章目录

  • 一. string底层逻辑
    • 演示声明和定义分开
  • 二. size()
  • 三. operator[]
  • 四. 迭代器
  • 四. const迭代器
  • 五. 预留空间(reserve)
  • 六. 尾插一个字符push_back
  • 七. 尾插一个字符串append
  • 八. operator+=
  • 九. operator+=

一. string底层逻辑

(1)为了和库里面的string类区分开,我们可以使用命名空间(hou)。之前学习的命名空间就有了价值。
(2)在类里面的都是内联函数在这里插入图片描述
(3)对于比较短小的函数,直接在类里面写就行。函数大一点,将声明和定义分开。

  1. 成员变量
#include<stdio.h>
#include<string>
#include<iostream>
namespace hou
{class string{private:char* _str;    //char类型数据数组的地址size_t _size;  //有效元素个数size_t _capacity; //空间大小};
}
  1. 成员函数
    任何一个类都从构造函数开始(无参/有参)

无参的话,将三个成员变量初始化为什么呢?都初始化为空吗?

这样是不可以的。
记得:const char*比较特殊,cout它不会打印出地址,它自动识别类型,会以为打印字符串(字符串的打印规则是遇到‘\0’才会终止),而我们的_str是空指针,将空指针解引用,肯定是错误的(本质是空指针问题)
在这里插入图片描述



---------------在这里插入图片描述
所以,不能将char*初始化为空。里面起码要放一个'\0'
在这里插入图片描述

namespace hou
{class string{public://任何一个类都从构造函数开始string()//先写一个无参的构造函数:_str(new char[1]{'\0'}),_size(0),_capacity(0){}~string(){delete[] _str;_str = nullptr;_size = 0;_capacity = 0;}const char* c_str()const{return _str;}private:char* _str;    //char类型数据数组的地址size_t _size;  //有效元素个数size_t _capacity; //空间大小};
}

刚刚写了无参的构造函数,接下来写一个有参的构造函数
注意点:

  1. strlen计算长度时,不包括'\0'
  2. strlen是在运行时计算的,size是编译时计算的
  3. 在初始化列表里写,它的初始化顺序是按照声明的顺序来的
    在这里插入图片描述
    之前我们说过,尽可能使用初始化列表,但是strlen是在运行时计算的,要计算3次,效率低。这样子的话,我们可以将strlen先计算出来,之后用。但记住,初始化列表的顺序是按照声明的顺序。

演示声明和定义分开

当我们想把声明写在.h里面,定义写在.cpp里面的时候
在这里插入图片描述
这样写会报错,所以我们需要在string.cpp里(1)写上类域(2)再写一下命名空间
一个命名空间是可以写多个的,多个文件的同一个命名空间会被合并为(认为)一个命名空间的
在这里插入图片描述




在这里插入图片描述

已经声明和定义了,还有一个需要注意的内容是,缺省值只能在声明的时候给(定义那里不可以写缺省值)。但是char* _str的缺省值不可以是nullptr,可以给一个'\0'或者直接“”(字符串默认后面会加'\0'的)

二. size()

  • 对象.size()就是为了得到对象的大小(即对象的有效元素个数)

如果声明和定义分开写了,同时这个函数有返回值,那string::加到哪里呢?

在这里插入图片描述

三. operator[]

string.cpp里面的内容

char& string::operator[](size_t i)
{return _str[i];
}

四. 迭代器

string的迭代器(string的物理结构是数组)

using iterator = char*;
//typedef char* iterator;

迭代器还需要配合begin()end()(begin()就是返回开始位置的迭代器)

using iterator = char*;
iterator string::begin()
{return _str;
}
iterator string::end()
{return _str+_size;
}

在这里插入图片描述

范围for的底层是迭代器(支持迭代器则支持范围for)

在这里插入图片描述

四. const迭代器

在这里插入图片描述

五. 预留空间(reserve)

本质就是扩容,但是这种提高了效率,原本需要2倍2倍的扩,但是当你知道需要多大的空间时,就可以一次性扩容好。

在这里插入图片描述

  1. reserve一般不缩容,我们需要先判断一下,想扩容的大小n是否比_capacity大
  2. 开空间的时候永远要多开一个,因为’\0‘是不计入_capacity
	void string:: reserve(size_t n){if (n > _capacity){char* tmp=new char[n+1];strcpy(tmp, _str);delete[]_str;_str = tmp;_capacity = n; //'\0'不计入空间大小}}

六. 尾插一个字符push_back

void string::push_back(char ch)
{//先判断空间大小是否足够if (_size = _capacity){//不够的话进入if语句进行扩容reserve(_capacity = 0 ? 4 : 2 * _capacity);}_str[_size] = ch;_size++;
}

七. 尾插一个字符串append

	void string::append(const char* str){size_t len = strlen(str);size_t newcapacity = 2 * _capacity < _size + len ? _size + len : 2 * _capacity;reserve(newcapacity);//开好空间之后,插入字符串strcpy(_str+_size, str);//直接复制(第一个参数是复制到哪里(位置),第二个是被复制的串)_size += len;}

八. operator+=

string& string:: operator+=(char ch)
{push_back(ch);return *this;
}

九. operator+=


string& string:: operator+=(const char* str)
{append(str);return *this;
}
http://www.yayakq.cn/news/614790/

相关文章:

  • 购物网网站建设开题报告百度 门户网站
  • 深圳网站定制建设网站建设界面ppt演示
  • 网站设计需求说明书巴中市文旅新区关坝片区安置房建设项目
  • 网站开发详细设计模板口碑营销的模式
  • 网站备案可以强制撤销吗广州优化网站建设
  • phpcms 网站根目录在哪个网站开发外贸业务
  • 网站建设桂林想建设个网站怎么赚钱
  • 大连哪家公司做网站好三桥网站建设
  • 网站建设运营要求链接网
  • 做网站设像素wordpress前端文章编辑器
  • 旅游 网站建设目标工作汇报
  • 网站免费源码大全无用下载平顶山网站建设费用
  • 中移建设 网站专业pc网站建设服务
  • 建设行业网站平台的瓶颈wordpress生成分类目录
  • 南京网站开发南京乐识行游戏网站建设成功案例
  • dk域名网站北京网站建设课程培训
  • 网站开发 工作深圳宝安区属于什么风险区
  • 哪些大学网站做的比较好旅游网站建设背景分析报告
  • 淄博网站排名优化报价网站开发环境与工具
  • 网站建设牜金手指花总十四上海环球金融中心多少层
  • 拍卖网站建设推广互联网推广
  • 侨联网站建设方案医院门户网站建设
  • cpc引流做网站cpa推广鞍山市网站建设
  • 电商网站新闻怎么做的免费建站的
  • 网站制作要素品牌网站开发价格
  • 科学做视频网站WordPress文章添加地图导航
  • 东莞餐饮网站建设企业网站设计步骤
  • 青岛网络推广建站嘉定集团网站建设
  • 海宁高端高端网站设计中国网站排名网
  • 服装行业网站开发wordpress下载连接插件