zoukankan      html  css  js  c++  java
  • 实现MyString类——构造函数,拷贝构造函数,析构函数,赋值函数,操作符重载函数

    编程环境,MacOS14.6

    #include <iostream>
    #include <stdio.h>
    #include <string>
    #include <assert.h>
    
    using std::cout;
    using std::endl;
    using std::string;
    
    class MyString
    {
    public:
        MyString(const char *str = nullptr);//普通构造函数,加nullptr包含无参的情况
        MyString(const MyString &other);//拷贝构造函数
        ~MyString();//析构函数
        MyString& operator=(const MyString &other);//赋值函数,返回一个对象的引用
        MyString& operator+(const MyString &other);//"+"操作符重载
        MyString& operator+=(const MyString &other);//"+="操作符重载
        void print_str();
    
    private:
        char *m_data;//保存字符串。
    };
    
    //普通构造函数
    MyString::MyString(const char *str) //输入参数为const型
    {
        if(nullptr == str)
        {
            cout << "普通构造函数========" << endl;
            m_data = new char[1];//对空字符串自动申请存放结束标志''
            *m_data = '';
        }
        else
        {
            cout << "普通构造函数========*str==" << str << endl;
            size_t length = strlen(str);//strlen()函数返回的长度不包括''
            m_data = new char[length + 1];//若能加nullptr判断则更好
            m_data[length] = '';
            strcpy(m_data, str);
        }
    }
    
    //拷贝构造函数
    MyString::MyString(const MyString &other)//输入参数为const型
    {
        cout << "拷贝构造函数==========" << endl;
        size_t length = strlen(other.m_data);
        m_data = new char[length + 1];
        m_data[length] = '';//添加结束符
        strcpy(m_data, other.m_data);
    }
    
    //析构函数
    MyString::~MyString()
    {
        cout << "析构函数========this==" << this << endl;
        delete []m_data;//数组用delete[],平时的析构用delete m_data;
    }
    //赋值函数,返回一个对象的引用
    MyString& MyString::operator=(const MyString &other)//输入参数为const型
    {
        cout << "赋值函数“=”号==========" << endl;
        if(this == &other) //检查自赋值
            return *this;
        delete []m_data;//释放原有的内存资源
        size_t length = strlen(other.m_data);
        m_data = new char[length + 1];
        m_data[length] = '';//添加结束标志符
        strcpy(m_data, other.m_data);
        return *this;//返回本对象的引用
    }
    //重载操作符“+”号
    MyString& MyString::operator+(const MyString &other)//输入参数为const型
    {
        cout << "重载操作符“+”号==========" << endl;
        size_t length = strlen(m_data) + strlen(other.m_data);
        char *temp =  new char[length + 1];
        assert(temp);
        strcpy(temp, m_data);
        strcat(temp, other.m_data);
        if(m_data)
            delete []m_data;
        m_data = temp;
        return *this;
    }
    
    //重载操作符“+=”号
    MyString& MyString::operator+=(const MyString &other)//输入参数为const型
    {
        cout << "重载操作符“+=”号==========" << endl;
        size_t length = strlen(m_data) + strlen(other.m_data);
        char *temp = new char[length + 1];
        assert(temp);
        strcpy(temp, m_data);
        strcat(temp, other.m_data);
        //释放原来的内存
        if(m_data)
            delete []m_data;
        m_data = temp;
        return *this;
    }
    
    void MyString::print_str()
    {
        cout << "print_str::m_data=======" << m_data << endl;
        //cout << "this->m_data=======" << this->m_data << endl;
    }
    
    int main()
    {
        MyString s0;//无参构造函数
        MyString s1("first");//有参构造函数
        MyString s2 = "second";//有参构造函数
        MyString s3 = s2;//拷贝构造函数;
    
        s0 = s1;//赋值函数;注意和上面一行的区别,
        s0.print_str();
        s0 + s1;//操作符"+"
        s0 += s2;//操作符"+="
        s0.print_str();
        cout << endl;
    
        MyString s4(nullptr);
        cout << endl;
        s4 = s1 + "_AAA";//调用3个函数:有参("_AAA")构造函数,重载操作符+函数,操作符=函数
        cout << endl;
        s4.print_str();
        cout << endl;
        s4 = s3 + s2;//不同于s4 = s1 + "_XXX",只调用两个函数,操作符+和操作符=
        cout << endl;
        s4.print_str();
        cout << endl;
    
        //s4 = "aaa" + "bbb";//错误,为什么,原因:+没有重载两个常量操作符。
        MyString s5 = s4 + "_BBB";//调用3个函数:有参("_BBB")构造函数,操作符+函数,拷贝构造函数
        cout << endl;
        s5.print_str();
    
        return 0;
    }
    

     运行结果

    普通构造函数========
    普通构造函数========*str==first
    普通构造函数========*str==second
    拷贝构造函数==========
    赋值函数“=”号==========
    print_str::m_data=======first
    重载操作符“+”号==========
    重载操作符“+=”号==========
    print_str::m_data=======firstfirstsecond

    普通构造函数========

    普通构造函数========*str==_AAA
    重载操作符“+”号==========
    赋值函数“=”号==========
    析构函数========this==0x7ffee387e9a8

    print_str::m_data=======first_AAA

    重载操作符“+”号==========
    赋值函数“=”号==========

    print_str::m_data=======secondsecond

    普通构造函数========*str==_BBB
    重载操作符“+”号==========
    拷贝构造函数==========
    析构函数========this==0x7ffee387e998

    print_str::m_data=======secondsecond_BBB
    析构函数========this==0x7ffee387e9a0
    析构函数========this==0x7ffee387e9b0
    析构函数========this==0x7ffee387e9b8
    析构函数========this==0x7ffee387e9c0
    析构函数========this==0x7ffee387e9d8
    析构函数========this==0x7ffee387e9e0

  • 相关阅读:
    使用原生JS封装一个动画函数
    在Vue 中调用数据出现属性不存在的问题
    vs code 如何修改默认主题的注释颜色
    HTML5新标签的兼容性处理
    如何在Vue中使用Mockjs模拟数据的增删查改
    call、apply和bind的用法
    JS原型继承的几种方式
    JavaScript基础部分经典案例
    运算符与基本数据类型
    python安装与初始
  • 原文地址:https://www.cnblogs.com/Vancamel/p/11830559.html
Copyright © 2011-2022 走看看