qfedu-cpp-level/day5/d3/mystring.cpp

97 lines
3.2 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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
}