美文网首页
C++实现string类

C++实现string类

作者: 二进制人类 | 来源:发表于2022-10-28 13:58 被阅读0次

mystring.h

#ifndef MYSTRING_H
#define MYSTRING_H
#include <iostream>
#include <string.h>
using namespace std;

class MyString
{
    friend ostream & operator<<(ostream &out, MyString ob);
    friend istream & operator>>(istream &in, MyString &ob);
private:
    char *str;
    int size;
public:
    MyString();
    MyString(const char *str);
    //有指针成员必须实现拷贝构造的深拷贝
    MyString(const MyString &ob);
    ~MyString();
    //有指针成员必须重载=运算符
    MyString& operator=(MyString &ob);
    MyString& operator=(const char *str);
    //获取字符串的长度
    int Size(void);
    //重载[]运算符
    char& operator[](int pos);
    //重载+运算符
    MyString operator+(const MyString &ob);
    MyString operator+(const char *str);

    //重载>运算符
    bool operator>(const MyString &ob);
    bool operator>(const char *str);

};

#endif // MYSTRING_H

mystring.cpp

#include "mystring.h"
MyString::MyString()
{
    str=NULL;
    size=0;
}


MyString::MyString(const char *str)
{
    //获取str的长度
    size = strlen(str);


    //根据size的长度申请堆区空间
    this->str=new char[size+1];
    memset(this->str, 0, size+1);


    //将str的字符串拷贝到this->str指向堆区空间中
    strcpy(this->str, str);
}


MyString::MyString(const MyString &ob)
{
    //获取ob的字符串长度
    size = ob.size;


    //根据size的长度申请堆区空间
    str=new char[size+1];
    memset(str, 0, size+1);


    //将ob.str指向的字符串 拷贝到  str指向的堆区中
    strcpy(str, ob.str);
}


MyString::~MyString()
{
    if(str != NULL)
    {
        delete [] str;
        str=NULL;
    }
}


MyString &MyString::operator=(MyString &ob)
{
    //得到大小
    size = ob.size;


    //如果str有指向 必须先释放str的指向空间
    if(str!=NULL)
    {
        delete [] str;
        str=NULL;
    }


    //重新根据size大小申请空间
    str=new char[size+1];
    memset(str, 0, size+1);


    //将ob.str指向的字符串 拷贝到  str指向的堆区中
    strcpy(str, ob.str);


    return *this;//完成str3=str2=str1这样的链式操作
}


MyString &MyString::operator=(const char *str)
{
    //释放this->str指向旧空间
    if(this->str != NULL)
    {
        delete [] this->str;
        this->str=NULL;
    }


    size = strlen(str);


    //根据size的长度申请堆区空间
    this->str=new char[size+1];
    memset(this->str, 0, size+1);


    //将str指向的字符串 拷贝到  this->str指向的堆区中
    strcpy(this->str, str);


    return *this;
}


int MyString::Size()
{
    return size;
}


char& MyString::operator[](int pos)
{
    //判断str是否为空
    if(str == NULL)
    {
        cout<<"字符串为空无法访问"<<endl;
        exit(-1);//结束进程
    }


    //pos位置是否合法
    if(pos < 0 || pos >=size)
    {
        cout<<"位置pos:"<<pos<<"不合法"<<endl;
        exit(-1);
    }


    return str[pos];
}


MyString MyString::operator+(const MyString &ob)
{
    MyString tmp;
    //tmp.size为两个对象的size之和
    tmp.size=size+ob.size;
    if(tmp.size == 0)
    {
        tmp.str=NULL;
        return tmp;
    }


    //为tmp.str申请堆区空间
    tmp.str = new char[tmp.size+1];
    memset(tmp.str,0,tmp.size+1);


    //str4+str5
    //拷贝str4.str到tmp.str指向的空间中
    if(str != NULL)
    {
        strcpy(tmp.str, str);
    }
    //将str5.str追加到tmp.str中
    if(ob.str != NULL)
    {
        strcat(tmp.str, ob.str);
    }


    return tmp;
}


MyString MyString::operator+(const char *str)
{
    MyString tmp;
    //tmp.size为两个对象的size之和
    tmp.size=size+strlen(str);
    if(tmp.size == 0)
    {
        tmp.str=NULL;
        return tmp;
    }


    //为tmp.str申请堆区空间
    tmp.str = new char[tmp.size+1];
    memset(tmp.str,0,tmp.size+1);


    //str4+"hello"
    //拷贝str4.str到tmp.str指向的空间中
    if(this->str != NULL)
    {
        strcpy(tmp.str, this->str);
    }
    //将str5.str追加到tmp.str中
    if(str != NULL)
    {
        strcat(tmp.str, str);
    }


    return tmp;
}


bool MyString::operator>(const MyString &ob)
{
    if(str==NULL || ob.str == NULL)
    {
        cout<<"字符串存在空无法比较"<<endl;
        exit(-1);
    }


    if(strcmp(str, ob.str)> 0)
        return true;
    return false;
}


bool MyString::operator>(const char *str)
{
    if(this->str==NULL || str == NULL)
    {
        cout<<"字符串存在空无法比较"<<endl;
        exit(-1);
    }


    if(strcmp(this->str, str)> 0)
        return true;
    return false;
}


//全局函数实现重载输出运算符 设置成MyString的友元
ostream & operator<<(ostream &out, MyString ob)
{
    if(ob.str != NULL)
        out<<ob.str;


    return out;
}
//全局函数实现重载输入运算符 设置成MyString的友元
istream & operator>>(istream &in, MyString &ob)
{
    char buf[1024]="";
    in.getline(buf,sizeof(buf));

    //释放ob.str指向的旧空间呢
    if(ob.str != NULL)
    {
        delete [] ob.str;
        ob.str=NULL;
    }

    ob.size = strlen(buf);
    ob.str = new char[ob.size+1];
    memset(ob.str, 0,ob.size+1);
    strcpy(ob.str, buf);

    return in;
}

相关文章

  • C++ 实现 String 类

    简单版,其他如 输入输出运算符,[] 等等查看 https://www.cnblogs.com/zhizhan/p...

  • C++实现string类

    mystring.h mystring.cpp

  • 技能

    C++ C++特性 C++11 多态和继承 构造函数 析构函数 手写代码实现string类 手写代码实现智能指针 ...

  • c++中的字符串string和C语言中的字符char

    c++中的字符串string 在c++中使用string类,必须在程序中包含头文件string #include ...

  • 高质量C++/C编程指南(转)

    1 有如下的c++类 class String { public: String(const char *str ...

  • 字符串

    C++提供了两种字符串的表示形式: C风格字符 C++引入的string类型 C风格 函数 C++中的String类

  • 【图文详解系列】String,StringBuffer与Stri

    一、Java String 类——String字符串常量 String 类实现了 CharSequence 接口。...

  • string的用法

    1、使用string头文件 要想使用标准C++中string类,必须要包含: 或者 string和wstring的...

  • C/C++语言基础

    语言基础 字符串类-string 常量与变量 运算符 程序和语句 字符串类-string (属于类类型)(c++中...

  • C++ string类

    构造函数 注意最后一个构造函数,用n个c来初始化字符串。例如string(5, 'a')就表示字符串"aaaaa"...

网友评论

      本文标题:C++实现string类

      本文链接:https://www.haomeiwen.com/subject/yakwzrtx.html