C++String 类完整源代码详解编程语言

MyString 类完整源代码

 

MyString.h文件

/***********************************************************

//Copyright (c) 2013 道合|SameIdeal.com  All rights reserved.

************************************************************/

#ifndef MYSTRING_H

#define MYSTRING_H #include <iostream>

using namespace std;

 

class MyString

{

public:

               //构造函数

                MyString();

                 MyString(const MyString&);

                  MyString(const char*);

                     MyString(const size_t,const char);

               //析构函数

                ~MyString();

               //属性

                   size_t length();//字符串的长度

                bool empty();//字符串是否为空

                   const char* c_str();//返回C风格字符串的指针

               //读写操作符

                    friend ostream& operator<< (ostream&,const MyString&);

                    friend istream& operator>> (istream&,MyString&);

                  //‘+’操作符

                      friend MyString operator+(const MyString&,const MyString&);

               //比较操作符

                      friend bool operator==(const MyString&,const MyString&);

                      friend bool operator!=(const MyString&,const MyString&);

                      friend bool operator<(const MyString&,const MyString&);

                      friend bool operator<=(const MyString&,const MyString&);

                      friend bool operator>(const MyString&,const MyString&);

                      friend bool operator>=(const MyString&,const MyString&);

               //下标操作符

                     char& operator[] (const size_t);

                      const char& operator[] (const size_t)const;

               //赋值操作符

                  MyString& operator=(const MyString&);

                //’+=’操作符

                  MyString& operator+=(const MyString&);

               //子串操作

                     MyString substr(size_t,size_t);

               //添加操作

                 MyString& append(const MyString&);

               //插入操作

                     MyString& insert(size_t,const MyString&);

               //替换操作

                      MyString& assign(const MyString&,size_t,size_t);

               //删除操作

                    MyString& erase(size_t,size_t);

 

private:

                  size_t strLength;

                 char* p_str;

};

 

#endif

 

MyString.cpp文件

/***********************************************************

//Copyright (c) 2013 道合|SameIdeal.com  All rights reserved.

************************************************************/

#include “MyString.h”

#include <cassert>

 

MyString::MyString():strLength(0),p_str(NULL){}

 

MyString::MyString(const MyString& str)

{

                    strLength = str.strLength;

                   p_str = new char[strLength+1];

                    strcpy(p_str,str.p_str);

}

 

MyString::MyString(const char* str)

{

                 if(str==NULL)

                               return;

                    strLength = strlen(str);

                   p_str = new char[strLength+1];

                   strcpy(p_str,str);

}

 

MyString::MyString(const size_t len,const char ch)

{

                  strLength = len;

       p_str = new char[strLength+1];  *(p_str+strLength)=’/0′;

                   strset(p_str,ch);

}

 

MyString::~MyString()

{

                  delete[] p_str;

size_t MyString::length()

{

                  return strLength;

bool MyString::empty()

{

                    return strLength==0?true:false;

const char* MyString::c_str()

{

                 return p_str;

}

//输出操作符

ostream& operator<< (ostream& out,const MyString& str)

{

                   if(str.p_str!=NULL)

                                out<<str.p_str;

                 return out;

}

//输入操作符

istream& operator>>(istream& in,MyString& str)//

{

                char temp[100];//临时字符串数组

                 if(in>>temp)

               {

                                  delete[] str.p_str;

                                   str.strLength = strlen(temp);

                                     str.p_str = new char[str.strLength+1];

                                  strcpy(str.p_str,temp);

               }

                 return in;

}

//下标操作符

char& MyString::operator [](const size_t index)

{

                   assert(index>=0 && index<=strLength);

                  return p_str[index];

}

//下标操作符(const情况)

const char& MyString::operator [](const size_t index)const

{

                   assert(index>=0 && index<=strLength);

                  return p_str[index];

}

 

//’+’操作符的重载

MyString operator+(const MyString& lhs,const MyString& rhs)

{

                 MyString ret;

                        ret.strLength = lhs.strLength + rhs.strLength;

                     ret.p_str = new char[ret.strLength+1];

                     strcpy(ret.p_str,lhs.p_str);

                     strcat(ret.p_str,rhs.p_str);

                 return ret;

}

 

//赋值操作符

MyString& MyString::operator=(const MyString& str)

{

                  if(this!=&str)

               {

                                   if(strLength<str.strLength)

                              {

                                                delete[] p_str;

                                                   p_str = new char[str.strLength+1];

                              }

                                   strLength = str.strLength;

                                   strcpy(p_str,str.p_str);

               }

                 return *this;

}

 

//’+=’操作符

MyString& MyString::operator+=(const MyString& str)

{

                   if(this == &str)

               {

                                MyString copy(str);

                                return *this+=copy;

               }

                     strLength += str.strLength;

                   char* p_old = p_str;

                    p_str = new char[strLength+1];

                    strcpy(p_str,p_old);

                  delete[] p_old;

                      strcat(p_str,str.p_str);

                  return *this;

}

 

//比较操作符

bool operator==(const MyString& lhs,const MyString& rhs)

{

                       return strcmp(lhs.p_str,rhs.p_str)==0;

}

bool operator!=(const MyString& lhs,const MyString& rhs)

{

                       return strcmp(lhs.p_str,rhs.p_str)!=0;

}

bool operator<(const MyString& lhs,const MyString& rhs)

{

                       return strcmp(lhs.p_str,rhs.p_str)<0;

}

bool operator<=(const MyString& lhs,const MyString& rhs)

{

                       return strcmp(lhs.p_str,rhs.p_str)<=0;

}

bool operator>(const MyString& lhs,const MyString& rhs)

{

                       return strcmp(lhs.p_str,rhs.p_str)>0;

}

bool operator>=(const MyString& lhs,const MyString& rhs)

{

                       return strcmp(lhs.p_str,rhs.p_str)>=0;

}

 

 

//子串操作 //返回一个MyString类型的字符串,它包含源字符串中从下标pos开始的n个

字符

MyString MyString::substr(size_t pos,size_t n)

{

       assert(pos+n<=strLength);     MyString ret;

                   ret.strLength = n;

                      ret.p_str = new char[ret.strLength+1];

                      for (size_t i=0;i!=n;++i)

                                    ret[i]=(*this)[pos+i];

                  ret[n]=’/0′;

                  return ret;

}

//添加操作

//将一个字符串的副本添加到源字符串的末尾,同“+=”操作符类似

MyString& MyString::append(const MyString& str)

{

                 *this+=str;

                  return *this;

}

//插入操作

//在下标为pos的元素之前插入MyString对象str的副本

MyString& MyString::insert(size_t pos,const MyString& str)

{

                   assert(pos<strLength);

                   char* p_old = p_str;

                    strLength +=str.strLength;

                    p_str = new char[strLength+1];

                      for (size_t i=0;i!=pos;++i)

                                   *(p_str+i) = *(p_old+i);

       for(size_t i=pos;i!=str.strLength+pos;++i)        *(p_str+i) = *(str.p_str+i-pos);

                          for(size_t i=str.strLength+pos;i!=strLength;++i)

                                       *(p_str+i) = *(p_old+i-str.strLength);

                    *(p_str+strLength)=’/0′;

                  delete[] p_old;

                  return *this;

}

//替换操作

//用s2中从下标pos开始的len个字符副本替换源字符串

MyString& MyString::assign(const MyString& s2,size_t pos,size_t len)

{

                   if(strLength<len)

               {

                                 strLength = len;

                                 delete[] p_str;

                                   p_str = new char[strLength+1];

               }

                      for(size_t i=0;i!=len;++i)

                                  *(p_str+i)=s2[pos+i];

                    *(p_str+strLength)=’/0′;

                  return *this;

}

//删除操作

//删除从下标pos开始的len个字符

MyString& MyString::erase(size_t pos,size_t len)

{

                    assert(pos+len<=strLength);

                     size_t index = pos + len;

                    while(*(p_str+index)!=’/0′)

               {

                                    *(p_str+index-len)=*(p_str+index);

                               ++index;

               }

                    *(p_str+index-len)=’/0′;

                  return *this;

}

 

原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/11835.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论