包括:
构造函数
析构函数
重载 = ,[],+=,+,==,!=,<,>,<=,>=,<<,>>;
at;
data;
c_str;
empty;
length;
capasityacity;
clear;
push_back;
pop_back;
append;
程序中我封装了大部分,相似的就忽略了()
/*将string类中能够实现的操作都封装在MyString类中
构造函数
析构函数
重载 = ,[],+=,+,==,!=,<,>,<=,>=,<<,>>;
at;
data;
c_str;
empty;
length;
capasityacity;
clear;
push_back;
pop_back;
append;
*/#include <iostream>
#include <cstring>
using namespace std;class MyString
{
private:char *str;size_t len;size_t capasity;public:// 构造函数MyString(){cout << "无参数构造函数" << endl;}explicit MyString(const char *s) : str(new char[strlen(s) + 1]), len(strlen(s)), capasity(strlen(s) + 1){strcpy(str, s);cout << "有参数构造函数" << endl;}// 析构函数~MyString(){delete[] str;cout << "析构函数" << endl;}// 扩容函数void expand(){capasity *= 2; // 2倍扩容char *tmp = new char[capasity];strcpy(tmp, str); // 拷贝致新的字符串delete[] str; // 释放旧的字符串str = tmp;cout << "扩容" << endl;}// 赋值运算符=MyString &operator=(const MyString &src){if (this != &src){delete[] str;len = src.len;str = new char[len + 1];capasity = src.capasity;strcpy(str, src.str);}return *this;}// 索引运算符[]char &operator[](int index){return str[index];}// 拼接运算符+MyString operator+(const MyString &src) const{char *newStr = new char[len + src.len + 1];strcpy(newStr, str);strcat(newStr, src.str);MyString result(newStr); // 使用新的字符串构造结果对象result.capasity = len + src.len + 1;delete[] newStr; // 释放临时分配的内存return result;}// 尾部添加+=MyString &operator+=(const MyString &src){char *newStr = new char[len + src.len + 1];strcpy(newStr, str);strcat(newStr, src.str);MyString result(newStr); // 使用新的字符串构造结果对象result.capasity = len + src.len + 1;delete[] newStr; // 释放临时分配的内存return result;}// 比较运算>bool operator>(const MyString &src) const{return strcmp(str, src.str) > 0;}// 比较运算<bool operator<(const MyString &src) const{return strcmp(str, src.str) < 0;}// 比较运算符==bool operator==(const MyString &src) const{return strcmp(str, src.str) == 0;}// at 访问指定字符,有边界检查char &at(int index){if (index < 0 || index >= len){cout << "index out of range" << endl;exit(EXIT_FAILURE);}return str[index];}// data 返回字符串首字母的指针char *data(){return str;}// c_str返回字符串的不可修改的c字符数组版本const char *c_str(){return str;}// empty判断是否为空bool empty(){return strlen(str) == 0;}// length返回字符串的长度size_t length(){return len;}// capasityacity返回字符串的容量// clear 清空字符串void clear(){len = 0;str[0] = '\0'; // 置空}// push_back 向字符串尾部添加字符void push_back(char c){if (len + 1 >= capasity){expand();}str[len] = c;len++;str[len] = '\0';}// pop_back 删除字符串尾部字符void pop_back(){if (len > 0){len--; // 字符串长度减一str[len] = '\0'; // 减少一个字符}}// 外部函数友元:// 输入输出流运算符<<friend ostream &operator<<(ostream &os, const MyString &s);
};// 输出流运算符<<
ostream &operator<<(ostream &out, const MyString &s)
{out << s.str << endl;return out;
}// 测试代码
int main()
{// 构造函数MyString s1("hello");MyString s2("world");// 测试重载加号MyString s3 = s1 + s2;// 测试重载<<cout << s1;// 测试+=s1 += s2;cout << s1;// 测试比较>if (s1 > s2){cout << "s1 > s2" << endl;}else{cout << "s1 <= s2" << endl;}// 测试at函数s1.at(0) = 'H';cout << s1;// 测试data函数cout << s3.data() << endl;// 测试length函数cout << s3.length() << endl;// 测试clear函数s2.clear();cout << s2.length() << endl;s2.push_back('a');cout << s2;// 测试扩容s1.push_back('A');cout << s1;// 测试pop_back函数s1.pop_back();cout << s1;return 0;
}
/*数值转换函数:可以试试
stoi;
stol;
stoll;
stoul;
stoull;
stof;
stod;
stold;*/