美文网首页
十四、自定义String类

十四、自定义String类

作者: 木鱼_cc | 来源:发表于2018-06-07 18:50 被阅读0次

用Sublime写的C++自定义String类,重点在重构!

-----------------------String.h-----------------------------

#ifndef __STRING_H__
#define __STRING_H__

class MyString{

  public:
     MyString();
     ~MyString();
     MyString(int len);//开辟len个长度的字符串 全部设置为0
     MyString(const MyString &another);//拷贝构造函数
     MyString& operator=(const MyString &another);//显示的=号构造符
     MyString(const char *str);//根据str字符串初始化MyString

     char& operator[](int index);//重载[]操作符

     MyString & operator+(MyString &another);
     bool operator ==(const MyString &another);
     bool operator !=(const MyString &another);
     bool operator >(const MyString &another);
     bool operator >(const MyString &another);

     friend ostream & operator <<(ostream &os,MyString &s);
     friend istream & operator >>(istream &is,MyString &s);//warning

     int getLen(){
        return this->len;
     }

     


  private:
    char *str;//指定在堆上开辟字符串空间首地址
    int len;//当前字符串的长度


}
#endif

-----------------------String.cpp-----------------------------


MyString::MyString()
{
    this->len = 0;
    this->str = NULL;
}
     
MyString::MyString(int len)
{
    if (len == 0)
    {
    this->len = 0;
    this->str = new char[len + 1];
    strcpy(this->str,"");
    }
    else
    {
     this->len = len;
     this->str = new char[len + 1];
     memset(this->str,0,len + 1);
    }
}

//拷贝构造函数
//MyString str1 = str2; MyString str1(str2);
MyString::MyString(const MyString &another)
{
     this->len = another.len;
     this->str = new char[another.len + 1]
     strcpy(this->str,another.str);
}


//MyString str1 = "1234455";
//MyString str1("1213214");
MyString::MyString(const char *str)
{
    if(str == NULL){
        this->len = 0;
        this->str = new char[len + 1];
        strcpy(this->str,"");
    }
    else{
     this->len = strlen(str);
     this->str = new char[len + 1];//已经在堆上开辟了内存
     /*for (int i = 0; i < this->len; ++i)
     {
        this->str[i] = str[i];
     }*/
     strcpy(this->str,str);//将str的内容拷贝到this->str堆空间中
    }
}


MyString& MyString::operator=(const MyString &another)
{
     this->len = 0;
     if (this->str != NULL)
     {
        delete[] this->str;
        this->str = NULL;
     }
     this->len = another.len;
     this->str = (char*)malloc(this->len + 1);
     strcpy(this->str,another.str);
     return *this;

}


char& MyString::operator[](int index)
{
     return this->str[index];
}

bool MyString::operator ==(const MyString &another)
{
     if (this->len != another.len)return false;
     if (strcmpy(this->str,another.str) != 0/*=0为真*/)return false;
     return true;
}


bool MyString::operator !=(const MyString &another)
{

    if (*this == another)return false;
    if (this->len == another.len)return false;
    if (strcmpy(this->str,another.str) == 0/*=0为真*/)return false;
    return true;
}

bool MyString::operator >(const MyString &another)
{
    int ret = strcmp(this->str,another.str);
    if (ret > 0)return true;
    else return false;
}

bool MyString::operator >(const MyString &another)
{
    int ret = strcmp(this->str,another.str);
    if (ret < 0)return true;
    else return false;
}


ostream & operator <<(ostream &os,MyString &s)
{
    os << s.str;//char*直接输出
    return os;
}

istream & operator >>(istream &is,MyString &s)
{
    //is>>s.str;//很危险!!!溢出就崩了!
    char buf[1024] = {0};
    char *temp = buf;
    cout<<"请输入一个字符串str:"<<endl;

    is>>temp;

    delete[] s.str;
    s.str = new char[strlen(temp)+1];
    strcpy(s.str,temp);
    s.len = strlen(temp);
    
    return is;
}


MyString & MyString::operator+(MyString &another)
{
    int len = this->len + another.len;
    char temp[this->len+1] = {0};

    strcpy(temp,this->str);

    delete[] this->str;
    this->str = new char[len+1];
    this->len = len;

    strcpy(this->str,temp);
    strncat(this->str,another.str,len - strlen(this->str) + 1);
   
    return *this;
}


MyString:: ~MyString()
{
    this->len = 0;
    if (this->str != NULL)
    {
        delete[] this->str;
        this->str = NULL;
    }
}






-----------------------main.cpp-----------------------------

#include <iostream>
#include "MyString.h"

int main(void){


   MyString str1(10);

   MyString str2("abcdef");

   MyString str3 = str1;

   MyString str4;

   str4 = str2;
   
   str4[0] = '1';//重构[]

   cout<<str4<<endl;//提供一个友元函数重载<<(cout,MyString);

   return 0;

}

相关文章

  • 十四、自定义String类

    用Sublime写的C++自定义String类,重点在重构!

  • 自定义Kotlin的String扩展方法

    自定义Kotlin的String扩展方法 1、 对系统lib里面的类进行扩展,称为扩展函数2、对String类进行...

  • JAVA基础(Object、String、StringBuffe

    自定义类初始化方法和属性 Object String StringBuffer Arrays Integer

  • 1.控制小数点的后几位

    DeclimalFormat类可以自定义多少位小数点,在new出DeclimalFormat(String for...

  • 不同类型底层的hashCode方法

    不同类型底层的hashCode方法 Integer Double String 自定义类Student 如何减少冲...

  • 双亲委派

    为什么双亲委派?::原因:修改java.lang.String类并且通过自定义类加载器加入到JVM中,等于覆盖了 ...

  • String

    1.String类2.String类和常量池3.String类常用的方法 1.String类 1.String类又...

  • ==与equals比较

    目录: 一、比较自定义类型的比较系统类型的比较String类的比较包装类的比较 二、结论==的比较equals的比...

  • String

    String UML类图 String 被 final 修饰,String 类不可被继承,不可变类。 String...

  • String类的构造方法和它的判断方法

    String类跟我们自定义的类不同,它是java类库里的一种类,它不需要我们再定义,它可以不通过new来创建对象。...

网友评论

      本文标题:十四、自定义String类

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