#pragma once
#include <iostream>
using namespace std;
#include <assert.h>namespace yyqx//为了与库里面的string进行区分
{//仅仅实现一个简单的string,仅仅考虑资源管理深浅拷贝问题class string{public://构造函数string(const char* str):_size(strlen(str)),_capacity(_size){_str = new char[strlen(str) + 1];//这里的+1,是为了'\0'开辟空间strcpy(_str, str);//拷贝的时候'\0'也拷贝了}string()//注意,这里不是给的空,而是给了一个空的字符串//标准库里的就是给了一个"":_size(0),_capacity(0){_str = new char[1];_str[0] = '\0';}//拷贝构造(深拷贝)//s2(s1)string(const string& s):_size(strlen(s._str)),_capacity(_size){_str = new char[_capacity + 1];strcpy(_str, s._str);}//赋值,也会有深浅拷贝的问题string& operator=(const string& s){if (this != &s)//避免自己给自己赋值,会导致值被释放,就会变成随机值{char* tmp = new char[s._capacity + 1];strcpy(tmp, s._str);delete[] _str;_str = tmp;_size = s._size;_capacity = s._capacity;}return *this;}//析构函数~string(){if (_str){delete[] _str;_str = nullptr;//好习惯_size = 0;_capacity = 0;}}//目的为了输出字符串const char* c_str() const{return _str;}//返回c格式的字符串char& operator[](size_t pos)//这里仅仅可以传入对象,不能传入const对象,如果是const对象,就会报错{assert(pos < _size);//注意这里的范围return _str[pos];}const char& operator[](size_t pos) const//这里就可以传入const对象{assert(pos < _size);return _str[pos];}//这里的const修饰的是this指针指向的对象const string s;size_t size() const//写const,普通对象以及const对象都可以调用,如果不加const对象就不可以调用{return _size;}size_t capacity() const//写const,普通对象以及const对象都可以调用{return _capacity;}private:char* _str;};
}
【C++ • STL】探究string的源码_c++ string 源码-CSDN博客