Bootstrap

C++ string类的实现

学了C++的重载机制之后,忍不住去探究一下C++中string类的内部实现过程。于是仿照这string类的功能,写了一个自己的string类练练手。可能还有些东西并未完善,后面再不断去完善。

参考代码如下所示:

Main.cpp

[cpp]  view plain  copy
  1. /***************************************************** 
  2. Copyright (C): 2017-2018   
  3. File name    : Main.cpp 
  4. Author       : Zhengqijun 
  5. Date         : 2017年02月10日 星期五 09时56分07秒 
  6. Description  :  
  7. Funcion List :  
  8. *****************************************************/  
  9.   
  10. #include <iostream>  
  11. #include "String.h"  
  12.   
  13. using namespace std;  
  14.   
  15. int main()  
  16. {  
  17.     String s1("hello");  
  18.     s1.Display();  
  19.   
  20.     String s2(s1);  
  21.     //String s2;  
  22.     //s2.Display();  
  23. #if 0  
  24.     String s3;  
  25.     s3 = s1;  
  26.     //s3 = "hello";  
  27.     s3.Display();  
  28. //#endif  
  29.   
  30.     s1[1] = 'E';  
  31.     s1.Display();  
  32. #endif  
  33.   
  34.     String s3("world");  
  35. #if 0  
  36.     s3 += s1;  
  37.     s3.Display();  
  38.   
  39.     cin >> s2;  
  40.     cout << s2 << endl;  
  41. #endif  
  42.   
  43.     s3 = s1 + s2;  
  44.     s3.Display();  
  45.   
  46.     return 0;  
  47. }  


String.h

[cpp]  view plain  copy
  1. /***************************************************** 
  2. Copyright (C): 2017-2018   
  3. File name    : String.h 
  4. Author       : Zhengqijun 
  5. Date         : 2017年02月10日 星期五 09时48分13秒 
  6. Description  :  
  7. Funcion List :  
  8. *****************************************************/  
  9.   
  10. #ifndef _STRING_H_  
  11. #define _STRING_H_  
  12.   
  13. #include <iostream>  
  14.   
  15. using namespace std;  
  16.   
  17. class String  
  18. {  
  19. public:  
  20.     String();  
  21.     String(char *str);  
  22.     String(const String& other);  
  23.     ~String();  
  24.   
  25.     String& operator=(char *str);  
  26.     String& operator=(const String& other);  
  27.   
  28.     char& operator[](unsigned int index);  
  29.     const char& operator[](unsigned int index) const;  
  30.   
  31.     friend String operator+(const String& s1, const String& s2);  
  32.   
  33.     String& operator+=(const String& s);  
  34.   
  35.     friend ostream& operator<<(ostream& out, const String& s);  
  36.     friend istream& operator>>(istream& in, String& s);  
  37.   
  38.     void Display();  
  39.   
  40. private:  
  41.     char *str_;  
  42. };  
  43.   
  44. #endif  

String.cpp

[cpp]  view plain  copy
  1. /***************************************************** 
  2. Copyright (C): 2017-2018   
  3. File name    : String.cpp 
  4. Author       : Zhengqijun 
  5. Date         : 2017年02月10日 星期五 09时50分05秒 
  6. Description  :  
  7. Funcion List :  
  8. *****************************************************/  
  9.   
  10. #include <iostream>  
  11. #include <string.h>  
  12. #include "String.h"  
  13.   
  14. using namespace std;  
  15.   
  16. String::String()  
  17. {  
  18.     str_ = new char['\0'];  
  19.     cout << "default construct String!" << endl;  
  20. }  
  21.   
  22. String::String(char *str)  
  23. {  
  24.     cout << "construct String!" << endl;  
  25.   
  26.     int len = strlen(str) + 1;  
  27.     str_ = new char[len];  
  28.     memset(str_, 0, len);  
  29.     strcpy(str_, str)  
  30. }  
  31.   
  32. String::String(const String& other)  
  33. {  
  34.     int len = strlen(other.str_) + 1;  
  35.     str_ = new char[len];  
  36.     memset(str_, 0, len);  
  37.     strcpy(str_, other.str_);  
  38. }  
  39.   
  40. String& String::operator=(const String& other)  
  41. {  
  42.     if(this == &other)  
  43.     {  
  44.         return *this;  
  45.     }  
  46.       
  47.     int len = strlen(other.str_) + 1;  
  48.     delete [] str_;  
  49.     str_ = new char[len];  
  50.     memset(str_, 0, len);  
  51.     strcpy(str_, other.str_);  
  52.   
  53.     return *this;  
  54. }  
  55.   
  56. String& String::operator=(char *str)  
  57. {  
  58.     delete [] str_;  
  59.     int len = strlen(str) + 1;  
  60.     str_ = new char[len];  
  61.     memset(str_, 0, len);  
  62.     strcpy(str_, str);  
  63.   
  64.     return *this;  
  65. }  
  66.   
  67. char& String::operator[](unsigned int index)  
  68. {  
  69.     //return str_[index];  
  70.     return const_cast<char&>(static_cast<const String&>(*this)[index]);  
  71. }  
  72.   
  73. const char& String::operator[](unsigned int index) const  
  74. {  
  75.     return str_[index];  
  76. }  
  77.   
  78. String operator+(const String& s1, const String& s2)  
  79. {  
  80. #if 0  
  81.     int len = strlen(s1.str_) + strlen(s2.str_) + 1;  
  82.     char *newptr = new char[len];  
  83.     memset(newptr, 0, len);  
  84.     strcpy(newptr, s1.str_);  
  85.     strcat(newptr, s2.str_);  
  86.     String tmp(newptr);  
  87. #endif  
  88.   
  89.     String tmp(s1);  
  90.   
  91.     tmp += s2;  
  92.   
  93.     return tmp;  
  94. }  
  95.   
  96. String& String::operator+=(const String& s)  
  97. {  
  98.     int len = strlen(s.str_) + strlen(str_) + 1;  
  99.   
  100.     char *newptr = new char[len];  
  101.     memset(newptr, 0, len);  
  102.     strcpy(newptr, str_);  
  103.     strcat(newptr, s.str_);  
  104.     String tmp(newptr);  
  105.       
  106.     delete [] str_;  
  107.     str_ = new char[len];  
  108.     strcpy(str_, newptr);  
  109.   
  110.     return *this;  
  111. }  
  112.   
  113. ostream& operator<<(ostream& out, const String& s)  
  114. {  
  115.     out << s.str_;  
  116.     return out;  
  117. }  
  118.   
  119. istream& operator>>(istream& in, String& s)  
  120. {  
  121.     char buffer[4096];  
  122.   
  123.     in >> buffer;  
  124.     s.str_ = buffer;  
  125.   
  126.     return in;  
  127. }  
  128.   
  129. String::~String()  
  130. {  
  131.     cout << "destroy String!" << endl;  
  132. }  
  133.   
  134. void String::Display()  
  135. {  
  136.     cout << "str = " << str_ << endl;  
  137. }  
;