97 lines
3.2 KiB
C++
97 lines
3.2 KiB
C++
|
#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
|
|||
|
}
|