String 类的现代写法,客官有兴趣吗

上一篇我们一起学习了String类的传统写法https://blog.csdn.net/a15929748502/article/details/81505333,现在我们一起来看看String 类的现代写法,下面的代码是我用现代写法实现的String类。

  1 #include<iostream>
  2 #include <string.h>
  3 using namespace   std;
  4 class   String
  5 {
  6         public :
  7                 String ()
  8                         :_str(new  char[1])
  9                 {
 10                         _str[0]='\0';
 11                 }
 12                 String (char *str)
 13                         :_str(new char[strlen (str)+1])
 14                 {
 15                         strcpy(_str,str);
 16                 }
 17 
 18 
 19                 String (const String& s)
 20                         :_str(NULL)
 21                 {
 22                         String tmp(s._str);
 23                         swap(_str,tmp._str);
 24 
 25                 }
 26                 String&   operator=( String& s)
 27                 {
 28                         swap(_str,s._str);
 29                         return *this;
 30                 }
 31 
 32                 ~String ()
 33                 {
 34                         if (_str)
 35                         {
 36                                 delete[]  _str;
 37                                 _str=NULL;
 38                         }
 39                 }
 40 
 41 
 42                 const char*c_str()
 43                 {
 44                         return _str;
 45                 }
 46 
 47 
 48         private:
 49                 char*  _str;
 50 
 51 
 52 };

我们可以看到现代写法要比传统写法简洁好多。这是因为我们对已经是已经实现的函数进行了复用。现代写法是创建出作用域在成员函数范围内的临时对象并把这个临时对象与this指针指向的内容进行了交换。这就是String的现代写法。下面我们给出String类的其他基本操作,(有关运算符的重载我就不写注释了,相信大家可以理解)

1 #include <iostream>
  2 #include <string.h>
  3 #include <assert.h>
  4 using namespace  std;
  5 
  6 
  7 class String
  8 {
  9         public:
 10                 String()
 11                         :_str(new  char [1])
 12                 {
 13                         _size=0;
 14                         _capacity=0;
 15                         _str[0]='\0';
 16                 }
 17                 String (char*str)
 18                         :_str(new char[strlen(str)+1])
 19                 {
 20                         _size=strlen (str);
 21                         _capacity=_size;
 22 
 23 
 24                         strcpy (_str,str);
 25                 }
 26 
 27                 void Swap(String& s)
 28                 {
 29                         swap(_str,s._str);
 30                         swap(_size,s._size);
 31                         swap(_capacity,s._capacity);
 32                 }
 33 
 34 
 35                 String (const   String&  s)
 36                         :_str(NULL)
 37                          ,_size(0)
 38                          ,_capacity(0)
 39         {
 40                 String tmp(s._str);
 41                 Swap(tmp);
 42         }
 43 
 44 
 45 
 46 
 47                 String&  operator=(String s)
 48                 {
 49                         Swap(s);
 50                         return  *this ;
 51                 }
 52 
 53 
 54                 ~String ()
 55                 {
 58                                 delete[]  _str;
 59                                 _str=NULL;
 60                         }
 61                 }
 62 
 63                 const  char*c_str()//返回字符串指针
 64                 {
 67 
 70                         if (n>_capacity)
 71                         {
 72                                 char  *newstr =new char[n+1];
 73                                 strcpy(newstr,_str);
 74                                 delete[]  _str;
 75                                 _str=newstr;
 76                                 _capacity=n;
 77                         }
 78                 }
 79 
 80 
 81                 void PushBack(char  ch )//向字符串尾插入字符
 82                 {
 85                                 Expand (_capacity*2);
 88 
 89                         _str[_size++]=ch;
 90                         _str[_size]='\0';
 91                         //Insert(_size  ,ch);
 92                 }
 93 
 94 
 99                         size_t   len =strlen (str);
100                         if (_size+len >_capacity)
101                         {
102                                 Expand(len +_size);
103                         }
104 
105 
106                         strcpy(_str+_size,str);
107                         _size+=len;
108 
109                         //Insert(_size,str);_
112 
113                 void PushFront (char  ch)//向字符串头插入字符
114                 {
115                         if (_size>=_capacity)
116                         {
117                                 Expand(_capacity*2);
120 
123                                 _str[i+1]=_str[i];
124                         }
125 
126 
127                         _str[0]=ch;
128                         _size++;
129                         //Insert(0,ch);
130                 }
131                 void PushFront(const  char*str)//向字符串头插入字符串
132                 {
133                         size_t   len=strlen (str);
134                         if (_size+len >_capacity)
135                         {
136                                 Expand (_size+len);
137                         }
138 
139                         for (int i=_size;i>=0;--i)
142                         }
145                         while (*str!='\0')
148                         }
151                         //Insert (0,str);
152                 }
153 
154 
155 
156 
157 
158                 void Erase (size_t  pos ,size_t  len )//删除POS位置的长度为len的字符串
159                 {
160                         assert (pos <_size);
161 
162 
163                         if (pos+len >=_size )
164                         {
165                                 _str[pos]='\0';
166                                 _size=pos;
167                         }
168 
169                         else
170                         {
171                                 strcpy (_str+pos ,_str+pos+len);
172                                 _size-=len;
173 
174                         }
175 
176                 }
177 
178                 String operator +(char  ch)
179                 {
180                         String s(*this );
181                         s.PushBack(ch);
182                         return s;
183                 }
184 
185                 String&  operator+=(char   ch)
186                 {
187                         PushBack (ch);
188                         return *this ;
191 
192 
195                 bool  operator >(const String&  s)const
196                 {
197 
198 
199                         const char *p1=_str;
200                         const char *p2=s._str;
201                         while (*p1&&*p2)
202                         {
203                                 if (*p1>*p2)
204                                 {
205                                         return true;
206                                 }
207                                 else if  (*p1<*p2)
208                                 {
209                                         return false;
210                                 }
211                                 else
212                                 {
213                                         ++p1;
214                                         ++p2;
217                         if (*p1)
218                         {
219                                 return true;
220                         }
221                         else
222                         {
223                                 return false;
224                         }
227 
228 
229 
230 
231                 bool operator >=(const  String&  s)const
232                 {
233                         return  *this >s||*this ==s;
236 
237                 bool   operator ==(const   String&  s)const
238                 {
239                         const char*  p1=_str;
240                         const char*  p2=s._str;
241                         while (*p1&&*p2)
244                                 {
245                                         return false;
246                                 }
247                                 else
250                                         ++p2;
251                                 }
252                         }
253                         if (*p1=='\0'&&*p2=='\0')
254                         {
255                                 return   true;
256                         }
257                         else
258                         {
259                                 return false;
262 
263                 char&  operator [](size_t   pos)
268 
269 
270 
273                         assert (pos<_size);
274 
275 
276                         return _str[pos];
277                 }
278 
279                 size_t   Find (char   ch,size_t   pos =0)//在字符串中,从POS 位置开始找字符
280                 {
281                         for (size_t  i=pos ;i<_size;i++)
282                         {
283                                 if (_str[i]=ch)
284                                 {
285                                         return i;
288                         return -1;
289                 }
290 
291 
292                 size_t Find (const   char*sub,size_t   pos=0)//在字符串中,从pos 位置开始查找字符串
293                 {
294                         assert (sub);
295                         assert (pos <_size);
296 
297 
298 
299                         const  char*src=  _str+pos;
302                                 const char*  match=sub;
303                                 const  char*cur=src;
304 
305 
306                                 while (*match&&*match==*cur)
307                                 {
308                                         ++match;
309                                         ++cur;
310                                 }
311 
312                                 if (*match =='\0')
313                                 {
314                                         return src-_str;
315                                 }
316                                 else
317                                 {
318                                         ++src;
319                                 }
320                         }
321                         return -1;
322                 }
323 
324         private:
325 
326                 char*  _str;
327                 size_t  _size;
328                 size_t   _capacity;
329 
330 
331 };

以上就是String的基本写法,下一篇呢我会把引用技术,写时拷贝说给你听,有兴趣的同学可以参考下。关注我哦

猜你喜欢

转载自blog.csdn.net/a15929748502/article/details/81507476