• 【C++】MyString


    #include
    #include
    using namespace std;
    class MyString
    {
    private:
    char* m_data;
    public:
    //无参构造
    MyString()
    {
    this->m_data = new char[1];
    this->m_data[0] = ‘\0’;
    }
    //有参构造(通过外部C风格字符串来对类中的属性指针进行初始化。)
    MyString(const char* c_str)
    {
    //1.获得外部字符串的字符的长度。
    int len = strlen(c_str);
    //2.开辟空间容纳这个长度的C型字符串。
    this->m_data = new char[len + 1];
    //3.通过内存拷贝的方式来拷贝外部字符串的数据到这个空间中。
    //memmove , memcpy
    memmove(this->m_data,c_str,len);
    //4.结尾处加\0;
    this->m_data[len] = ‘\0’;
    }
    //拷贝构造:
    MyString(const MyString& other)
    {
    int len = strlen(other.m_data);
    this->m_data = new char[len + 1];
    memmove(this->m_data,other.m_data, len);
    this->m_data[len] = ‘\0’;
    }
    //MyString的析构函数
    ~MyString()
    {
    if(m_data != nullptr)
    {
    delete []m_data;
    //好习惯来了。
    m_data = nullptr;
    }
    }
    //获取字符串长度的函数。
    int size()
    {
    return strlen(this->m_data);
    }
    //MyString的中括号运算符重载函数。
    char operator[](int index)
    {
    //1.判断下标是否合法。
    if(index < 0 || index > this->size())
    {
    cout << “越界” << endl;
    }
    return this->m_data[index];
    }
    //MyString的=号运算符重载
    MyString& operator=(const MyString& other)
    {
    if(this == &other)
    {
    return *this;
    }
    //获取另一对象中的字符长度。
    int len = strlen(other.m_data);
    //如果本象中的中属性指针有一个指向。就需要先释放。再开辟新的足名够大的空间才可以。
    if(this->m_data != nullptr)
    {
    delete []m_data;
    this->m_data = new char[len + 1];
    }else
    {
    this->m_data = new char[len + 1];
    }
    //拷贝数据:
    memmove(this->m_data, other.m_data, len);
    this->m_data[len] = ‘\0’;
    return this;
    }
    //作业,写完发群里。
    //同学这个自己去写,可以使用strncat,或者自己纯纯的生写。
    MyString& operator+(const MyString& other)
    {
    //this->m_data = strncat(this->m_data,other.m_data,strlen(other.m_data));
    int len = strlen(this->m_data) + strlen(other.m_data);
    char
    temp = new char[len + 1];
    memmove(temp,this->m_data,strlen(this->m_data));
    memmove(temp + strlen(this->m_data),other.m_data,strlen(other.m_data));
    temp[len] = ‘\0’;
    delete []this->m_data;
    this->m_data = temp;

        return *this;
    }
    char* getM_data()
    {
        return this->m_data;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    };
    //实现一个<<运算符重载;
    ostream& operator<<(ostream& cout, MyString& other)
    {
    cout << other.getM_data();
    return cout;
    }
    int main()
    {
    MyString str1;
    MyString str2(“zhangsan”);//证明我们的有参构造没有问题。
    str1 = str2;//我们的=号运符重载没问题。
    cout << str1 << endl;//<<左移也没问题。
    MyString str3(str1);//拷贝构造也没问题。
    cout << str3 << endl;
    cout << str3[4] << endl;
    return 0;
    }

  • 相关阅读:
    【Swift 60秒】53 - Using closures as parameters when they accept parameters
    Rust常用特型之TryFrom和TryInto特型
    【自动化测试】之PO模式介绍及案例
    请问嵌入式或迁移学习要学什么?
    【计算机操作系统慕课版】第二章课后习题笔记(创作周年纪念版)
    分块 学习笔记
    2022年9月26日 9点 程序爱生活 纳指和恒指可能要创新低,然后迎来反弹,很大概率继续往下。
    DDD领域驱动设计-视频讲解+实战
    品牌百度百科应该怎样创建?编辑品牌百度百科词条的秘籍!
    【Linux】认识文件(三):缓冲区
  • 原文地址:https://blog.csdn.net/weixin_43466725/article/details/126807387