自己实现简单的string类
1.前言
最近看了下《C++Primer》,觉得受益匪浅。不过纸上得来终觉浅,觉知此事须躬行。今天看了类类型,书中简单实现了String类,自己以前也学过C++,不过说来惭愧,以前都是用C来写程序,学的C++基本都忘记了,也说明自己以前对C++的理解不够深入。基于这些,觉得有必要动手来写写C++的一些程序了,毕竟C++有很多的功能是C所不具备的。正好看了课本中String类的简单实现,而且string类在C++中的使用频率也很高,了解其内部的实现是很有必要的。所以今天打算写个string类,就当做练手吧。
2.String类的设计
写类首先是定义类的名字,我们实现的string就叫String吧,以防和标准库中的string类冲突。其次是类中的内部数据,既然是字符串类,必须要把字符串类所代表的字符串保存起来,所以必须定义一个存放这些字符的字符数组或者一个指向字符数组的指针。我是用后者实现,因为这样更为的灵活,不会因为提前定义数组的大小而限制了能存放到数组中的字符个数。为了方便,可以定义字符串的长度,当然也可以不定义,可以在字符数组的末尾存放0来表示字符串的结束,不过每次得到字符串的长度比较麻烦。最后是类对外的接口,根据我们平时使用string类的情况,我们一般会用到接口size(), c_str(),还有就是+,=,>>,<<,+=,[],==等操作符。
根据前面的分析,可以得到我们要设计的String类中的成员如下所示:
1 class String 2 { 3 public: 4 String(); 5 String(const char *); 6 String(const String &); 7 String(String &&); //新加的move构造函数 8 9 ~String(); 10 11 String& operator=(const char *); 12 String& operator=(const String &); 13 14 bool operator==(const char *); 15 bool operator==(const String &); 16 17 char &operator[](int); 18 19 String operator+(const char *); 20 String operator+(const char); 21 String operator+(const String &); 22 23 String &operator +=(const char *); 24 String &operator +=(const char); 25 String &operator +=(const String &); 26 27 int size(){return _size;} 28 char *c_str(){return _string;} 29 30 friend istream &operator>>(istream &cin, String &str); 31 private: 32 int _size; 33 char *_string; 34 };
3.String类的主要实现
我们先来说一下构造函数的实现。由于我想实现的String类中存放字符的数组大小是可以根据实际需要存放字符的个数来动态调整的(这样对于存放字符的个数就没有限制,除非内存不够用了),所以必须根据实际存放的字符个数来动态的申请内存空间,代码可以用如下的方式实现:
1 String::String(const char *str) 2 { 3 if (!str) 4 { 5 _size = 0; 6 _string = NULL; 7 } 8 else 9 { 10 _size = strlen(str); 11 _string = new char[_size + 1]; 12 strcpy(_string, str); 13 _string[_size] = 0; 14 } 15 }
由于构造函数动态申请了内存,所以必须定义析构函数来释放我们申请的内存空间。
1 String::~String() 2 { 3 if (_string) 4 delete _string; 5 6 cout << "~String() call" << endl; 7 }