C++ 自定义实现MyString类

来源:互联网 发布:新开的淘宝店如何推广 编辑:程序博客网 时间:2024/06/06 02:54

学习了C++ 的特性:
封装、继承、多态,老师让根据String库,实现String的功能,通过用重载实现符号的功能。

此文实现了

具体来看代码:

mystring.h

#ifndef _MYSTRING_H_#define _MYSTRING_H_#include <iostream>#include <cstdio>#include <cstring>#include <malloc.h>  //申请空间使用using namespace std;class MyString{private:    char* m_data;    size_t length;//长度public:    char* getStr();  //获取字符串    MyString();   //无参构造函数    MyString(const char* str);//有参构造函数    MyString(const MyString &strcla);//拷贝构造函数    MyString(int n,char ch);//由n个ch字符组成的字符串    //s[n]    char getStrChar(const int n);//获取字符串第n个字符    //s.size() 字符串的长度    int size()const    {        return strlen(m_data);    }    //s.empty 判断是不是空  此处用的是内联函数    bool empty();    MyString& operator =(const MyString& other);//重载=    bool operator >(const MyString& other)const;//大于0    bool operator <(const MyString& other)const;//小于0    bool operator >=(const MyString& other)const;//大于或者等于0    bool operator <=(const MyString& other)const;//小雨或者等于0    bool operator ==(const MyString& other)const;    MyString operator +(const MyString& other);//字符串相加    ~MyString();//析构函数    //友元函数    friend istream& operator >>(istream& is,const MyString& str);    friend ostream& operator <<(ostream& os,const MyString& str);//重载[]    char& operator [](int n)const{    if(n>=size())    {        return m_data[size()-1];    }    else    {        return m_data[n];    }}};#endif

定义类
mystring.cpp

#include "mystring.h"MyString::MyString(){    this->m_data = new char[1];    *(this->m_data) = '\0';}char* MyString::getStr(){    return this->m_data;}MyString::MyString(const char* str){    if(str==NULL)    {        this->m_data = new char[1];        *(this->m_data) = '\0';    }else    {#if 0        int i = 0;        while(m_data[i]!='\0')        {            m_data[i]=str[i];            i++;        }        m_data[i]='\0'; #endif        int length = strlen(str);        m_data = new char[length+1];        strcpy(m_data,str);    }}MyString::MyString(const MyString &strcla){    int length = strlen(strcla.m_data);    this->m_data = new char[length+1];    strcpy(this->m_data,strcla.m_data);}MyString::~MyString(void){    delete[] this->m_data;}MyString::MyString(int n,char ch){    int i=0;    m_data = new char[1];    for(;i<n;i++)    {        m_data[i]=ch;    }    m_data[n]='\0';}MyString& MyString::operator =(const MyString &other){    if(this==&other)    return *this;    delete[] m_data;    int length = strlen(other.m_data);    m_data = new char[length+1];    strcpy(m_data,other.m_data);    return *this;}    //s[n]    char MyString::getStrChar(const int n)    {        char ch ='\0';        if(n<=0){            cout<<"输入的位置不正确!"<<endl;        }else{            int i = 0;            for(;i<this->size();i++)            {                if(i==(n-1))                {                    ch = m_data[i];                    break;                }            }        }        return ch;    }    //s.empty    bool MyString::empty()    {        bool bo = false;        if(this->size()<=0)        {            bo = true;        }        return bo;    }    bool MyString::operator >(const MyString& other)const//大于0    {        bool is_ok = false;    unsigned    int i = 0;        for(;i<strlen(m_data);i++)        {            if(m_data[i]>other.m_data[i])            {                is_ok = true;                break;            }        }        return is_ok;    }    bool MyString::operator <(const MyString& other)const//小于0    {        bool is_ok = false;    unsigned    int i = 0;        for(;i<strlen(m_data);i++)        {            if(m_data[i]<other.m_data[i])            {                is_ok = true;                break;            }        }        return is_ok;    }    bool MyString::operator >=(const MyString& other)const//大于或者等于0    {        bool is_ok = false;    unsigned    int i = 0;        for(;i<strlen(m_data);i++)        {            if(m_data[i]>other.m_data[i]||m_data[i]==other.m_data[i])            {                is_ok = true;                break;            }        }        return is_ok;    }    bool MyString::operator <=(const MyString& other)const//小于或者等于0    {        bool is_ok = false;    unsigned    int i = 0;        for(;i<strlen(m_data);i++)        {            if(m_data[i]<other.m_data[i]||m_data[i]==other.m_data[i])            {                is_ok = true;                break;            }        }        return is_ok;    }bool MyString::operator ==(const MyString& other)const{    bool is_ok = true;    if(strlen(m_data)!=strlen(other.m_data))    {        is_ok=false;    }else    {     unsigned   int i = 0;        for(;i<strlen(m_data);i++)        {            if(m_data[i]!=other.m_data[i])            {                is_ok = false;                break;            }        }    }    return is_ok;}MyString MyString::operator +(const MyString& other)//字符串相加{    int size =  this->size()+ other.size();    char *s = (char*)malloc(sizeof(char)*size);    int i = 0;    int si = this->size();    for(;i<si;i++)    {        s[i]=m_data[i];    }    int j = 0;    int osi = other.size();    for(;j<osi;j++)    {        s[i+j]=other.m_data[j];    }    s[i+j]='\0';//字符串结尾    return MyString(s);}//重载输出运算符ostream& operator << (ostream& os,const MyString& str){    unsigned int i = 0;    for(;i<strlen(str.m_data);++i)    {        os << str.m_data[i];    }    return os;}//重载输入运算符istream& operator >> (istream& is,const MyString& str){    char ch;    unsigned int i = 0;    while(1)    {        is >> noskipws;//noskipws => no skip whitespace(空白)            //noskipws 不是不忽略输入前的空格, 而是 不忽略 任意地方的空格        is >> ch;        if( ch == '\n')        {            break;        }        else        {            str.m_data[i]=ch;            i++;        }    }    str.m_data[i]='\0';    return is;}

测试运行类
mainstr.cpp

 #include "mystring.h"int main(int argc,char* argv[]){//  char* str1 = "abcdefghigklmnopqrstuvwxyz";    MyString str0("abcdefghigklmnopqrst");    cout<<"str1:"<<str0.getStr()<<endl;    MyString ms1;    cout<<"ms1:"<<ms1.getStr()<<endl;    MyString ms2(str0);    cout<<"ms2:"<<ms2.getStr()<<endl;    MyString ms3("abcdefg");    cout<<"ms3:"<<ms3.getStr()<<endl;    MyString s4 = "s4123sddfjk";    cout<<"s4:"<<s4.getStr()<<endl;    MyString ms5(6,'a');    cout<<"s5:"<<ms5.getStr()<<endl;    MyString ms6 = "abc";    MyString ms7 = "adc";    if(ms6==ms7){        cout<<"ms6==ms7:"<<endl;    }    else{        cout<<"ms6!=ms7:"<<endl;    }    MyString ms9 = MyString("12345767");    cout<<"ms6.size():"<<ms9.size()<<endl;    MyString s8 = ms6+ms7;    cout<<"ms6+ms7:"<<s8.getStr()<<endl;    MyString str1(ms9);    cout<< "str1:"<<str1<<endl;    cout<<str1.getStr();    cout << endl << endl;    MyString str2;    str2 = ms6;    cout<< "str2:"<<str2<<endl;    cout<<str2.getStr();    cout << endl << endl;    //第几位的字符    cout<<str2.getStrChar(3)<<endl;    // 判断是不是空的    if(str2.empty())    {        cout<<"empty"<<endl;    }else    {        cout<<"no empty"<<endl;    }    //重载[]    cout<<"str2[2]:"<<str2[2]<<endl;    return 0;}

上图运行结果

这里写图片描述

欢迎大家评论回复;
如有问题可以联系 QQ:976968684

原创粉丝点击