c++学习 2024.9.2

运算符重载

实现mystring中的一些功能

#include <iostream>
#include <cstring>

class MyString {
private:
    char* data;

public:
    // 构造函数
    MyString(const char* str = "") 
    {
        if (str) 
        {
            data = new char[strlen(str) + 1];
            strcpy(data, str);
        }
        else
        {
            data = new char[1];
            *data = '\0';
        }
    }

    // 析构函数
    ~MyString() 
    {
        delete[] data;
    }

    // 赋值运算符重载
    MyString &operator=(const MyString &other)
    {
        if (this != &other) 
        {
            delete[] data;
            data = new char[strlen(other.data) + 1];
            strcpy(data, other.data);
        }
        return *this;
    }

    // +运算符符重载
    MyString operator+(const MyString &other) 
    {
        MyString result;
        delete[] result.data;
        result.data = new char[strlen(data) + strlen(other.data) + 1];
        strcpy(result.data, data);
        strcat(result.data, other.data);
        return result;
    }
    //下标访问或修改字符
    char& operator[](size_t index)
    {
        return data[index];
    }
    const char& operator[](size_t index)const
    {
        return data[index];
    }
    //清除内容clear
    void clear()
    {
        delete[] data;
        data =new char[1];
        *data='\0';
    }
    // c_str成员函数  
       const char* c_str() const 
       {  
           return data;  
       }  
    //empty函数
    void empty()
    {

        if(data[0]=='\0')
        {
            std::cout<<"字符串为空"<<std::endl;
        }else
        {
            std::cout<<"字符串不为空"<<std::endl;
        }
    }
    //size函数
    int size()
    {
        int len=strlen(data);
        return len;
    }

    //push_back函数
    void push_back(char a)
    {
        int len=strlen(data);
        char* newdata=new char[len+2];
        strcpy(newdata,data);
        newdata[len]=a;
        newdata[len+1]='\0';
        delete []data;
        data=newdata;
    }
    //pop_back函数
    void pop_back()
    {
        int len=strlen(data);
        data[len-1]='\0';
    }
    //运算符>重载
    bool operator>(const MyString &R)const
    {
        bool res=this->data>R.data;
        return res;
    }
    //运算符>=重载
    bool operator>=(const MyString &R)const
    {
        bool res=this->data>R.data||this->data==R.data;
        return res;
    }
    //<   <=  同理 不具体写了
    //运算符!=重载
    bool operator!=(const MyString &R) const
    {
        return !(this->data == R.data);
    }


    // 输出运算符重载有缘
    friend std::ostream& operator<<(std::ostream& os, const MyString& s);
    //==运算符重载有缘
    friend bool operator==(const MyString& L,const MyString& R);
};

// 实现输出运算符重载
std::ostream& operator<<(std::ostream& os, const MyString& s) 
{
    os << s.data;
    return os;
}
//==运算符重载
bool operator==(const MyString& L,const MyString& R)
{
    return strcmp(L.data,R.data)==0;
}

int main() {
    MyString s1("Hello");
    MyString s2(" World");
    MyString s3 = s1 + s2;
    std::cout <<"s3字符串为:"<< s3 << std::endl; // 输出: Hello World
    std::cout<<"s3[4]:"<<s3[4]<<std::endl;
    std::cout<<"*******************************"<<std::endl;
    //修改s3
    s3[0]='w';
    std::cout <<"修改后,s3字符串为:"<< s3 << std::endl;
    std::cout<<"*******************************"<<std::endl;
    //测试清除函数
    std::cout<<"s2内容为:"<<s2<<std::endl;
    s2.clear();
    std::cout<<"执行clear后s2内容为:"<<s2<<std::endl;
    std::cout<<"*******************************"<<std::endl;
    //测试push_back,pop_back函数
    std::cout<<"s1内容为:"<<s1<<std::endl;
    s1.push_back(' ');
    s1.push_back('a');
    std::cout<<"执行push_back后s1内容为:"<<s1<<std::endl;
    s1.pop_back();   //删去'a'
    s1.pop_back();   //删去空格
    std::cout<<"执行pop_back后s1内容为:"<<s1<<std::endl;
    std::cout<<"*******************************"<<std::endl;
    //测试empty函数
    s1.empty();
    std::cout<<"*******************************"<<std::endl;
    //测试size函数
    int len=s1.size();
    std::cout<<"s1字符数为:"<<len<<std::endl;
    std::cout<<"*******************************"<<std::endl;
    //测试>
    if(s1.size()>s2.size())  //s1.size()==5   s2.size()==0
    {
        std::cout<<"yes"<<std::endl;
    }
    else
    {
        std::cout<<"no"<<std::endl;
    }
    if(s1.size()>5)  //s1.size()==5
    {
        std::cout<<"yes"<<std::endl;
    }
    else
    {
        std::cout<<"no"<<std::endl;
    }
    //测试>=
    if(s1.size()>=5)  //s1.size()==5
    {
        std::cout<<"yes"<<std::endl;
    }
    else
    {
        std::cout<<"no"<<std::endl;
    }
    //测试!=
    if(s1.size()!=s2.size())
    {
        std::cout<<"yes"<<std::endl;
    }
    else
    {
        std::cout<<"no"<<std::endl;
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值