首页 > > > C++语言string类的实现(完整源代码).pdf

C++语言string类的实现(完整源代码).pdf

C++语言string类的实现(完整源代码).pdf

上传者: 永生换魂 2014-02-23 评分1 评论0 下载1 收藏10 阅读量734 暂无简介 简介 举报

简介:本文档为《C++语言string类的实现(完整源代码)pdf》,可适用于软件工程领域,主题内容包含MyString类完整源代码MyStringh文件*************************************************符等。

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; } 本文首次发表在 道合|sameideal.com 欢迎大家访问我的独立技术博客~

该用户的其他资料

  • 名称/格式
  • 评分
  • 下载次数
  • 资料大小
  • 上传时间

用户评论

0/200
    暂无评论
上传我的资料

相关资料

资料评价:

/ 7
所需积分:1 立即下载
返回
顶部
举报
资料
关闭

温馨提示

感谢您对爱问共享资料的支持,精彩活动将尽快为您呈现,敬请期待!