💞💞 前言
hello hello~ ,这里是大耳朵土土垚~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹
💥个人主页:大耳朵土土垚的博客
💥 所属专栏:C++入门至进阶
这里将会不定期更新有关C++的内容,希望大家多多点赞关注收藏💖💖
1.string类基本框架
通过对string类的学习,我们知道string类的模拟实现最主要是实现string类的构造、拷贝构造、赋值运算符重载以及析构函数,以下是对模拟实现string类变量以及函数的封装:
为了防止与库里面string类名字重复,我们将自己模拟实现的string类放在tutu的命名空间中(名字可以自定义),这样使用时就不会冲突了;其次对于string类的模拟实现我们采用声明与定义分离,方便大家查看string类中包含哪些函数;如下是对string类的声明:
#pragma once #define _CRT_SECURE_NO_WARNINGS 1 #include #include using namespace std; namespace tutu //命名空间,可自定义名字 { class string //定义string类 { public: //string(); //构造函数 string(const char* str = ""); string(const string& s); //赋值运算符重载 string& operator=(const string& s); //析构函数 ~string(); typedef char* iterator; //定义迭代器 typedef const char* const_iterator;//常量使用的迭代器 iterator begin(); iterator end(); const_iterator begin() const; const_iterator end() const; //获取字符串指针 const char* c_str() const; //获取string类的容量 size_t size() const; size_t capacity()const; //[]重载 char& operator[](size_t pos); const char& operator[](size_t pos) const; //常量版本 //空间操作 void reserve(size_t n); //预留空间 void resize(size_t n, char ch = '\0');//重设空间大小 bool empty()const;//判断字符串是否为空 void clear();//清空字符串 //尾插操作 void push_back(char ch);//尾插字符 void append(const char* str);//插入字符串 //+=重载 string& operator+=(char ch);//尾插字符 string& operator+=(const char* str);//尾插字符串 //在pos位置插入 void insert(size_t pos, char ch); void insert(size_t pos, const char* str); //删除pos位置的值 void erase(size_t pos = 0, size_t len = npos); //查找字符/字符串 size_t find(char ch, size_t pos = 0); size_t find(const char* str, size_t pos = 0); //交换 void swap(string& s); //截取字符串 string substr(size_t pos = 0, size_t len = npos); //运算符重载 bool operator(const string& s) const; bool operator=(const string& s) const; bool operator==(const string& s) const; bool operator!=(const string& s) const; private: // char _buff[16]; char* _str = nullptr; size_t _size = 0; size_t _capacity = 0; const static size_t npos = -1; }; //流插入提取重载 istream& operator>> (istream& is, string& str); ostream& operator size_t len = strlen(str); //计算字符串长度 _str = new char[len + 1]; //开辟空间 _size = _capacity = len; //设置capacity和size值 strcpy(_str, str); //拷贝字符串 } _str = new char[s._capacity + 1]; strcpy(_str, s._str); _size = s._size; _capacity = s._capacity; } 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; } delete[] _str; _str = nullptr; _capacity = _size = 0; } void Test1() { tutu::string s1 = "hello"; tutu::string s2(s1); tutu::string s3 = s1; } } return _str; //返回字符串指针 } string::iterator string::end() { return _str + _size; //返回字符串指向'\0'的指针,也就是最后一个元素的下一个 } return _str; } string::const_iterator string::end() const { return _str + _size; } return _str; } return _size; } return _capacity; } assert(pos