实现C++标准库string类的简单版本
Posted jz_cnblogs
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实现C++标准库string类的简单版本相关的知识,希望对你有一定的参考价值。
后续待更新。
1 #ifndef STRING_H 2 #define STRING_H 3 4 #include <cassert> 5 #include <utility> 6 #include <iostream> 7 8 namespace jz 9 { 10 11 /************************************************************************/ 12 /* 重新实现C风格字符串处理函数 */ 13 /************************************************************************/ 14 15 //求C风格字符串长度 16 size_t StrLen(const char *str) 17 { 18 assert(str != nullptr); 19 size_t len = 0; 20 while (*str++ != ‘\0‘) 21 { 22 ++len; 23 } 24 return len; 25 } 26 27 //复制C风格字符串 28 char* StrCpy(char *dest, const char *src) 29 { 30 assert(dest != nullptr && src != nullptr); 31 char *temp = dest; 32 while ((*temp++ = *src++) != ‘\0‘); 33 return dest; 34 } 35 36 //复制指定长度字符串 37 char* StrNCpy(char *dest, const char *src, size_t n) 38 { 39 assert(dest != nullptr && src != nullptr); 40 char *temp = dest; 41 while (n-- && (*temp++ = *src++) != ‘\0‘); 42 if (*temp != ‘\0‘) 43 { 44 *temp = ‘\0‘; 45 } 46 return dest; 47 } 48 49 //拼接字符串 50 char* StrCat(char *dest, const char *src) 51 { 52 assert(dest != nullptr && src != nullptr); 53 char *temp = dest; 54 while (*temp != ‘\0‘) 55 { 56 ++temp; 57 } 58 while ((*temp++ = *src++) != ‘\0‘); 59 return dest; 60 } 61 62 //比较字符串 63 int StrCmp(const char *lhs, const char *rhs) 64 { 65 assert(lhs != nullptr && rhs != nullptr); 66 int ret = 0; 67 while (!(ret = *lhs - *rhs) && *rhs) 68 { 69 ++lhs; 70 ++rhs; 71 } 72 if (ret > 0) 73 { 74 return 1; 75 } 76 else if (ret < 0) 77 { 78 return -1; 79 } 80 else 81 { 82 return 0; 83 } 84 } 85 86 /************************************************************************/ 87 /* 实现标准库String类 */ 88 /************************************************************************/ 89 class String 90 { 91 //重载==运算符 92 friend bool operator==(const String &lhs, const String &rhs) 93 { 94 if (StrCmp(lhs.str, rhs.str) == 0) 95 { 96 return true; 97 } 98 else 99 { 100 return false; 101 } 102 } 103 104 //重载!=运算符 105 friend bool operator!=(const String &lhs, const String &rhs) 106 { 107 return !(lhs == rhs); 108 } 109 110 //重载+运算符 111 friend String operator+(const String &lhs, const String &rhs) 112 { 113 String temp; 114 delete[] temp.str; 115 temp.str = new char[lhs.Size() + rhs.Size() + 1]; 116 StrCpy(temp.str, lhs.CStr()); 117 StrCat(temp.str, rhs.CStr()); 118 return temp; 119 } 120 121 //重载<<运算符 122 friend std::ostream& operator<<(std::ostream &os, const String &rhs) 123 { 124 os << rhs.str; 125 return os; 126 } 127 128 public: 129 //默认构造函数 130 String() : str(new char[1]) 131 { 132 *str = ‘\0‘; 133 } 134 135 //C风格字符串作为参数的构造函数 136 String(const char *cstr) : str(new char[StrLen(cstr) + 1]) 137 { 138 StrCpy(str, cstr); 139 } 140 141 //拷贝构造函数(委托构造函数) 142 String(const String &rhs) : String(rhs.str) 143 { 144 145 } 146 147 //拷贝赋值运算符,使用传值参数,保证异常安全并可自我赋值 148 String& operator=(String rhs) 149 { 150 Swap(rhs); 151 return *this; 152 } 153 154 //析构函数 155 ~String() 156 { 157 delete[] str; 158 } 159 160 //重载+=运算符 161 String& operator+=(const String &rhs) 162 { 163 *this = *this + rhs; 164 return *this; 165 } 166 167 //重载[]运算符 168 char& operator[](size_t i) 169 { 170 assert(i >= 0 && i <= StrLen(str)); 171 return str[i]; 172 } 173 174 //求字符串长度 175 size_t Size() const 176 { 177 return StrLen(str); 178 } 179 180 //返回C风格字符串 181 const char* CStr() const 182 { 183 return str; 184 } 185 186 //交换 187 void Swap(String &rhs) 188 { 189 std::swap(str, rhs.str); 190 } 191 192 private: 193 char *str; 194 }; 195 196 } 197 198 #endif
以上是关于实现C++标准库string类的简单版本的主要内容,如果未能解决你的问题,请参考以下文章