#include "mystring.h" using namespace std; ostream &operator<<(ostream &cout, const MyString &str) { cout << str.mStr; // 输出字符串 mStr return cout; // 返回 cout 输出流对象 } istream &operator<<(istream &cin, MyString &str) { cin >> str.mStr; // 输入字符串 mStr return cin; // 返回 cin 输入流对象 } MyString::MyString(const char *str) { mSize = strlen(str); // 计算字符串长度 mStr = new char[mSize + 1]; // 为 '\0' 留一个位置 strcpy(mStr, str); // 拷贝字符串 } MyString::MyString(const MyString &str) { mSize = str.mSize; // 拷贝字符串长度 char *p = new char[mSize + 1]; // 为 '\0' 留一个位置 strcpy(p, str.mStr); // 拷贝字符串 delete[] this->mStr; // 删除之前的空间 this->mStr = p; // 指向新的空间 } MyString::~MyString() { delete[] mStr; // 释放空间 } // 字符串拼接 MyString &MyString::operator+(MyString &other) { mSize += other.mSize; // 计算新的字符串长度, 用原有长度加上 other 的长度 char *p = new char[mSize + 1]; // 为 '\0' 留一个位置 strcpy(p, mStr); // 拷贝 mStr strcat(p, other.mStr); // 拼接 other.mStr delete[] this->mStr; // 删除之前的空间 this->mStr = p; // 指向新的空间 } MyString &MyString::operator+(const char *other) { mSize += strlen(other); // 计算新的字符串长度, 用原有长度加上 other 的长度 char *p = new char[mSize + 1]; // 为 '\0' 留一个位置 strcpy(p, mStr); // 拷贝 mStr strcat(p, other); // 拼接 other delete[] this->mStr; // 删除之前的空间 this->mStr = p; // 指向新的空间 } // 字符串赋值 MyString &MyString::operator=(MyString &other) { mSize = other.mSize; // 拷贝字符串长度 char *p = new char[mSize + 1]; // 为 '\0' 留一个位置 strcpy(p, other.mStr); // 拷贝字符串 delete[] mStr; // 删除之前的空间 mStr = p; // 指向新的空间 } MyString &MyString::operator=(const char *other) { mSize = strlen(other); // 拷贝字符串长度 char *p = new char[mSize + 1]; // 为 '\0' 留一个位置 strcpy(p, other); // 拷贝字符串 delete[] mStr; // 删除之前的空间 mStr = p; // 指向新的空间 } // 字符串比较 MyString &operator==(MyString &other) { return strcmp(mStr, other.mStr) == 0; // 比较字符串 } MyString &operator==(const char *other) { return strcmp(mStr, other) == 0; // 比较字符串 } // 读取字符串中 index 位置的字符 char MyString::operator[](int index) { cout << "长度: " << mSize << endl; // index 支持负数, -1 表示倒数第一个字符 // index 是负数,计算机存储是补码,如果直接位运算,以补码的方式 & 位运算符 // 需要手动取反补码(~), 然后 +1 int absIndex = (~index + 1) & 0x7fffffff; // 0x7fffffff 是有符号正整数 int 的最大值 // 0x7fffffff = 0111 1111 1111 1111 1111 1111 1111 1111 }