使用C++的朋友对string类都不会陌生,string类使用起来很是方便,比C的字符数组好用多了,但是我们能不能自己实现一个属于自己的string类呢?
实现一个具有基本功能的string类并不难,但是还是得掌握以下几点知识:构造函数、析构函数、运算符重载、指针、引用等等。
我自己实现了一个string类,一来是想用自己学的知识做一些有实际作用的东西,二则使用自己的东西也很有成就感,现在给大家作为参考,有错误或者不合理的地方欢迎大家指正。
为了区别标准库中的string类和相关标识符,我的类名叫mystring,而相关函数名也大多以这种方式处理,其中每个函数都经过本人测试,在参数合法的前提下均能正常使用,但组合在一起使用的情况则没有进行太多测试。
首先是mystring.h文件
#ifndef MYSTRING_H_INCLUDED #define MYSTRING_H_INCLUDED #include <iostream> using namespace std; class mystring { public: mystring(); mystring(const char * ptr_s); mystring(const mystring & refer_str);//拷贝构造函数 int mylength();//计算字符串的长度 ~mystring(); friend istream & operator>>(istream & is, mystring & refer_str); friend ostream & operator<<(ostream & os, const mystring & refer_str); mystring & operator=(const mystring & refer_str); void mygetline();//对输入按行读取 char & operator[](int n); friend mystring operator+(const mystring & refer_str_1, const mystring & refer_str_2); mystring & operator+=(const mystring & refer_str); friend bool operator==(const mystring & refer_str_1, const mystring & refer_str_2); friend bool operator!=(const mystring & refer_str_1, const mystring & refer_str_2); mystring mysubstr(int pos, int posn);//计算一个字符串的子串,pos为起始位置,从0开始,posn为希望求得的子串的长度 friend void mystrswap(mystring & str1, mystring & str2);//交换两个字符串 int myfind(char ch, int pos = 0);//从pos开始查找字符ch在当前字符串中的位置,pos从0开始,返回值也从0开始 mystring & myerase(int pos, int posn);//从pos开始删除当前字符串中的字符,pos从0开始,posn表示希望删除的字符数量,返回删除后字符串的引用,也即当前字符串 mystring & myinsert(int pos, const mystring & refer_str);//将refer_str代表的字符串插入到当前字符串中,pos表示插入的位置,0 <= pos <= mystrlen((*this).ptr_s) mystring & myinsert(int pos, const mystring & refer_str, int posn);//将refer_str代表的字符串插入到当前字符串中,pos表示插入的位置,0 <= pos <= mystrlen((*this).ptr_s),0 <= posn <= mystrlen(refer_str.ptr_s) private: char * ptr_s; }; int mystrlen(const char * ptr_s);//计算字符串的长度 void mystrcpy(char * ptr_s_1, const char * ptr_s_2);//将ptr_s_2指向的内容复制到ptr_s_1所指向的空间,但前提后者空间足够 int mystrcmp(const char * ptr_s_1, const char * ptr_s_2);//比较ptr_s_1指向的内容和ptr_s_2指向的内容,若两者相同返回0,前者大返回1,前者小返回-1 void mystrcat(char * ptr_s_1, const char * ptr_s_2);//将ptr_s_2指向的内容连接到ptr_s_1指向的内容的后面,但需保证ptr_s_1所指向的空间足够,并且ptr_s_1所指向的空间必须经过初始化,即包含有意义的字符串结束符 #endif // MYSTRING_H_INCLUDED
我的想法是尽量不使用标准库,但为了重载>>和<<这两个运算符并实现mygetline()函数,还是得在mystring.h中包含iostream。
然后是mystring.cpp文件
#include "mystring.h" mystring::mystring() { ptr_s = new char[1]; *ptr_s = '