上一篇我们一起学习了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的基本写法,下一篇呢我会把引用技术,写时拷贝说给你听,有兴趣的同学可以参考下。关注我哦