将string类中能够实现的操作都封装在MyString类中
包括:
构造函数
析构函数
重载 = ,[],+=,+,==,!=,<,>,<=,>=,<<,>>;
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;*/