当前位置: 首页 > article >正文

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


http://www.kler.cn/a/287928.html

相关文章:

  • 【MySQL】MVCC详解, 图文并茂简单易懂
  • CMD批处理命令入门(5)——ping,ipconfig,arp,start,shutdown,taskkill
  • excel 整理表格,分割一列变成多列数据
  • Spring Boot 应用开发入门
  • 《异步编程之美》— 全栈修仙《Java 8 CompletableFuture 对比 ES6 Promise 以及Spring @Async》
  • git使用-小白入门2
  • 如何保证Redis与Mysql双写一致性?
  • 【话题讨论】VS Code:倍增编程动力,实现效率飞跃
  • TCP 和 UDP 区别
  • c++ 定义宏常量
  • 有什么简单方便的cad编辑器?2024快速进行cad编辑的软件合集
  • 神经网络训练不起来怎么办(五)| Batch Normalization
  • 【无标题】html前段小知识点
  • Django Admin对自定义的计算字段进行排序
  • hugging face 利用现有模型进行预测
  • C语言 strlen求字符串长度
  • Linux驱动(三):字符设备驱动之杂项
  • Go wv(WebView2) GUI框架介绍和使用
  • 【Python报错已解决】“NameError: name ‘re‘ is not defined”
  • BeanFactory 和 FactoryBean 的区别
  • 用QT写一个加载模板文件,替换关键字为实际值
  • 【前端框架】你知道的前端框架有哪些呢
  • JavaWeb(基于SpringBoot开发)全总结(1)
  • 藏头诗娱乐小程序源码
  • 如何在 Spring Boot 中创建自定义注解简化重复编码
  • 栈和队列