11.string(上)
把text_string1 2声明去掉,定义直接放到text。cpp,用命名空间包一下,

这有个bug,unsiged int 不会小于0,end不会小于0,
、改成int仍然不行

这是手动打断点,当两个操作数类型不一样的时候进行类型提升或者截断,一般让范围小的向范围大的提升,end提升成无符号,就是无限大。
强转一下就不会提升了
这是另一种方式
reserve永远都会多开一个,不需要考虑\0



这三处出错,就算不写len==0,也没事因为-1是最大值,不会进来
要画图
这种情况说明都要删
左闭右开一减就是个数
pos不能给越界的,

void string::erase(size_t pos, size_t len){assert(pos < _size);if (len >= _size - pos){_str[pos] = '\0';_size = pos;}else{for (size_t i = pos + len; i <= _size; i++){_str[i - len] = _str[i];}_size -= len;}}尽可能保持画图,才能不出错





然后测试一下 find 和这个
报错了

sub拷贝构造临时对象,再拷贝构造,编译器优化了中间的,没有写拷贝构造,这里默认是浅拷贝,出了作用于sub销毁了,suffix是野指针了,这应该用深拷贝,release为啥没问题,和三唯一,把临时对象 优化掉了,把sub也给优化掉了。直接让suffix充当sub了,没有触发这个bug,
我们保证不了编译器优不优化,所以我们要显示提供拷贝构造,

不写赋值默认生成的也是浅拷贝的赋值,还导致s之前的空间直接丢掉了,
还有个小风险,s给s赋值上来就把自己删除了

实现两个就可以,修改比较方式方便,所以用复用
bool operator<(const string& s1, const string& s2){return strcmp(s1.c_str(), s2.c_str()) < 0;}bool operator<=(const string& s1, const string& s2){return s1 < s2 || s1 == s2;}bool operator>(const string& s1, const string& s2){return !(s1 <= s2);}bool operator>=(const string& s1, const string& s2){return !(s1 < s2);}bool operator==(const string& s1, const string& s2){return strcmp(s1.c_str(), s2.c_str()) == 0;}bool operator!=(const string& s1, const string& s2){return !(s1 == s2);}库里面三个版本,string和string,string和字符串。字符串和字符串而我们只写了一个版本
单参数构造函数支持隐式类型转换,string支持用const字符串构造,可以隐士类型换成string,我这需要构造一个,它不需要,
这个会不会隐式类型转换,不会,运算符重载必须有个类类型参数,常量字符串会被识别成两个指针,被认为是两个指针比较。
