个人做游戏下载网站侵权吗,兰州工程建设信息网站,网站整站开发视频教程,wordpress 3.9 sae文章目录 一. string底层逻辑演示声明和定义分开 二. size()三. operator[]四. 迭代器四. const迭代器五. 预留空间#xff08;reserve)六. 尾插一个字符push_back七. 尾插一个字符串append八. operator九. operator 一. string底层逻辑 #xff08;1#xff09;为了和库里面… 文章目录 一. string底层逻辑演示声明和定义分开 二. size()三. operator[]四. 迭代器四. const迭代器五. 预留空间reserve)六. 尾插一个字符push_back七. 尾插一个字符串append八. operator九. operator 一. string底层逻辑 1为了和库里面的string类区分开我们可以使用命名空间hou。之前学习的命名空间就有了价值。 2在类里面的都是内联函数 3对于比较短小的函数直接在类里面写就行。函数大一点将声明和定义分开。 成员变量
#includestdio.h
#includestring
#includeiostream
namespace hou
{class string{private:char* _str; //char类型数据数组的地址size_t _size; //有效元素个数size_t _capacity; //空间大小};
}成员函数 任何一个类都从构造函数开始无参/有参
无参的话将三个成员变量初始化为什么呢都初始化为空吗
这样是不可以的。 记得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; //空间大小};
}刚刚写了无参的构造函数接下来写一个有参的构造函数 注意点
strlen计算长度时不包括\0strlen是在运行时计算的size是编译时计算的在初始化列表里写它的初始化顺序是按照声明的顺序来的 之前我们说过尽可能使用初始化列表但是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倍的扩但是当你知道需要多大的空间时就可以一次性扩容好。 reserve一般不缩容我们需要先判断一下想扩容的大小n是否比_capacity大开空间的时候永远要多开一个因为’\0‘是不计入_capacity的 void string:: reserve(size_t n){if (n _capacity){char* tmpnew char[n1];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;
}