C++学习9.24

1、 将昨天的My_string类中的所有能重载的运算符全部进行重载

+、\[\] 、>、=、>)

头文件

复制代码
#ifndef MY_STRING_H
#define MY_STRING_H


#endif // MY_STRING_H

#include <iostream>
#include <cstring>
//#include <stdexcept>

using namespace std;

class My_string
{
private:
    char *ptr;         //指向字符数组的指针
    int size;           //字符串的最大容量
    int len;            //字符串当前容量


public:
    //加法
    const My_string operator+(const My_string &R)const;

    const My_string operator+=(const My_string &R);

    char operator[](int index)const;

    friend ostream & operator<< (ostream &L,const My_string &R);

    friend istream & operator>> (istream &L,My_string &R);

    bool  operator>(My_string &R);

    bool  operator<(My_string &R);

    bool  operator==(My_string &R);

    bool  operator<=(My_string &R);

    bool  operator>=(My_string &R);

    bool  operator!=(My_string &R);

    //无参构造
    My_string();


    //有参构造
    My_string(const char* src);
    My_string(int num, char value);
    //拷贝构造
    My_string(const My_string &other);
    //拷贝赋值
    My_string& operator= (const My_string &other);
    //析构函数
    ~My_string();
    //判空
    bool  empty();
    //尾插
    void push_back(char value);
    //尾删
    void pop_back();
    //at函数实现
    char &at(int index);
    //清空函数
    void clear();
    //返回C风格字符串
    char *data();
    //返回实际长度
    int get_length();
    //返回当前最大容量
    int get_size();
};

源文件

复制代码
#include "My_string.h"
//加法
const My_string My_string::operator+(const My_string &R)const
{
    My_string result;
    result.len = len + R.len;
    result.size = size + R.size;
    result.ptr = new char[result.size];
    strcpy(result.ptr,ptr);
    strcat(result.ptr,R.ptr);

    return result;

}
//加等
const My_string My_string::operator+=(const My_string &R)
{
    *this = *this + R;

    return *this;
}

char My_string::operator[](int index)const
{
    if(index<0 || index>len)
    {
        return -1;
    }
    return ptr[index];
}

ostream & operator<< (ostream &L,const My_string &R)
{
    L<<R.ptr<<endl;

    return L;
}

istream & operator>> (istream &L,My_string &R)
{
    char buff[1024];
    L >> buff;
    R.len = strlen(buff);
    R.size = R.len + 1;
    delete [] R.ptr;
    R.ptr = new char[R.size];
    strcpy(R.ptr,buff);


    return L;
}

bool My_string:: operator>(My_string &R)
{
    return strcmp(ptr,R.ptr)>0;
}

bool My_string:: operator<(My_string &R)
{
    return strcmp(ptr,R.ptr)<0;
}

bool My_string:: operator==(My_string &R)
{
    return strcmp(ptr,R.ptr)==0;
}

bool My_string:: operator<=(My_string &R)
{
    return strcmp(ptr,R.ptr)<=0;
}

bool My_string:: operator>=(My_string &R)
{
    return strcmp(ptr,R.ptr)>=0;
}

bool My_string:: operator!=(My_string &R)
{
    return strcmp(ptr,R.ptr)!=0;
}






//无参构造
My_string::My_string():size(15)
{
    this->ptr = new char[size];
    this->ptr[0] = '\0';            //表示串为空串
    this->len = 0;
}


//有参构造
My_string:: My_string(const char* src)
{
    len = strlen(src);
    size = len+1;
    ptr = new char[size];
    strcpy(ptr,src);
}
My_string:: My_string(int num, char value): size(num+1),len(num)
{
    ptr = new char[size];
    for(int i=0;i<num;i++)
    {
        ptr[i] = value;
    }
    ptr[num] = '\0';
}
//拷贝构造
My_string:: My_string(const My_string &other):size(other.size),len(other.len)
{
    ptr = new char[size];
    strcpy(ptr,other.ptr);
}
//拷贝赋值
My_string & My_string ::operator =(const My_string &other)
{
    if(this ==&other)
    {
        return *this;
    }
    delete [] ptr;

    size = other.size;
    len = other.len;
    ptr = new char[size];
    strcpy(ptr,other.ptr);

    return *this;
}
//析构函数
My_string:: ~My_string()
{
    delete [] ptr;
}
//判空
bool My_string:: empty()
{
    return len ==0;
}
//尾插
void My_string:: push_back(char value)
{
    if(len+1>=size)
    {
        size *=2;
        char* new_ptr = new char[size];
        strcpy(new_ptr,ptr);
        delete []ptr;
        ptr = new_ptr;
    }

    ptr[len] = value;
    len++;
    ptr[len] = '\0';
}
//尾删
void My_string:: pop_back()
{
    if(len>0)
    {
        len--;
        ptr[len]='\0';
    }
}
//at函数实现
char&My_string:: at(int index)
{
    if(index<0 ||index>=len)
    {
        //throw  out_of_range("超出");
    }
    return ptr[index];
}
//清空函数
void My_string:: clear()
{
    len = 0;
    ptr[0] = '\0';
}
//返回C风格字符串
char*My_string:: data()
{
    return ptr;
}
//返回实际长度
int My_string:: get_length()
{
    return len;
}
//返回当前最大容量
int My_string:: get_size()
{
    return size;
}

2、 思维导图

相关推荐
Scott9999HH14 小时前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
2401_8414956414 小时前
【操作系统】进程同步与互斥实验报告
c++·算法·操作系统·进程·并发·同步·互斥
fqbqrr15 小时前
2607C++,soui与安卓
c++·soui
码智社15 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海15 小时前
python 列表、元组、集合和字典
开发语言·python
萧瑟余晖16 小时前
JDK 26 新特性详解
java·开发语言
马优晨16 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
a11177618 小时前
2FA 验证码生成器(github登录验证 app)
笔记·学习
我的xiaodoujiao18 小时前
API 接口自动化测试详细图文教程学习系列32--Allure测试报告2
python·学习·测试工具·pytest
fqbqrr18 小时前
2607C++,使用微软detours勾挂工具
c++