将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;*/

猜你喜欢

转载自blog.csdn.net/sjrhsk_hahaha/article/details/141830723