MyString(重写String)

http://wenku.baidu.com/view/d7ac113243323968011c925b.html

已知类String的原型为:

class String{
public:
    String(const char *str = NULL); // 普通构造函数
    String(const String &other);     // 拷贝构造函数
    ~ String(void);         // 析构函数
    String & operator =(const String &other);// 赋值函数
private:
    char   *m_data;    // 用于保存字符串
};

  请编写String的上述4个函数。

  1 /*
  2 ccnu_hupo_cpp_class_tst6exercise2_by:lele_2013_10_30
  3    new不忘delete
  4 Design the string class in the C++ library by providing your own implementation for the following functions (name your class MyString):
  5 
  6 MyString();//构造
  7 MyString(const char* cString);//地址不能变
  8 char at(int index) const;//输入数组下标,返回字符
  9 int length() const;//长度
 10 void clear();//清空 len=0
 11 bool empty() const;//是否清空?len不变
 12 int compare(const MyString& s) const;//
 13 int compare(int index, int n, const MyString& s) const;
 14 void copy(char s[], int index, int n);
 15 char* data() const;
 16 int find(char ch) const;
 17 int find(char ch, int index) const;
 18 int find(const MyString& s, int index) const;
 19 
 20 */
 21 
 22 #include<iostream>
 23 #include<string.h>
 24 using namespace std;
 25 class MyString
 26 {
 27 public:
 28     MyString(void):a(NULL){cout << "MyString()" << endl;}
 29     MyString(const char* cString=NULL);//ordinary func
 30     MyString(const MyString &other);//copy func
 31     MyString & operator =(const MyString &other);//assign func
 32     //~MyString(void);
 33     char at(int index) const;//
 34     int length() const;
 35     void clear();
 36     bool empty() const;
 37     int compare(const MyString& s) const;
 38     int compare(int index, int n, const MyString& s) const;
 39     void copy(char s[], int index, int n);
 40     char* data() const;
 41     int find(char ch) const;
 42     int find(char ch, int index) const;
 43     int find(const MyString& s, int index) const;
 44 
 45     // MyString &operator+=(const MyString &other);
 46     //MyString operator +(const MyString &mystr);
 47     //MyString &operator +(const MyString &mystr);
 48     //重载为友元函数,重载"+"运算符(不改变被加对象)  注意返回引用不行
 49     friend MyString operator +(const MyString& mystr1,const MyString &mystr2);
 50     MyString &operator+=(const MyString &other);
 51 
 52     bool operator > (const MyString & another);
 53     bool operator < (const MyString & another);
 54     bool operator == (const MyString & another);
 55 
 56     char& operator[](int idx);
 57 
 58     void dis();
 59     friend ostream& operator<<(ostream& os,const MyString& other);
 60 
 61     ~MyString();
 62 
 63 private:
 64     char *a;
 65     int len;
 66 };
 67 
 68 
 69 //MyString::MyString(){
 70 //    cout << "MyString()" << endl;
 71 //}
 72 MyString::~MyString(){
 73     cout<<"~MyString():delete..."<<endl;
 74     delete []a;
 75 }
 76 
 77 MyString::MyString(const char* cString)
 78 {
 79     if (cString==NULL)
 80     {
 81         a=new char[1];
 82         a[0]=0;
 83         //int len=0;
 84     }
 85     else
 86     {
 87         len = strlen(cString);//new
 88         a=new char [len+1];
 89         strcpy(a,cString);
 90         //len=strlen(cString);
 91     }
 92 }
 93 
 94 MyString::MyString(const MyString &other){
 95     int len = strlen(other.a);
 96     a = new char[len+1];
 97     strcpy(a, other.a);
 98 }
 99 
100 MyString &MyString::operator =(const MyString &other){
101     //self check assign
102     if(this == &other){
103         return *this;
104     }
105     //释放原有的内存资源
106     delete []a;
107     //分配新的内存资源,并复制内容
108     int len = strlen(other.a);
109     a = new char[len+1];
110     strcpy(a, other.a);
111     //返回本对象的引用
112     return *this;
113 }
114 
115 char MyString::at(int index) const
116 {
117     if(len==0)
118     {cout<<"no char in string"<<endl;
119         return 0;
120     }
121     if(index>len)
122     {
123         cout<<"the maximun array exceed"<<endl;
124         return 0 ;
125     }
126     else
127     {
128 
129         return a[index-1];
130     }
131 }
132 
133 int MyString::length() const
134 {
135     return len;
136 }
137 
138 void MyString::clear()
139 {
140     if(!a)
141     {
142         delete []a;
143         a=NULL;
144     }
145 
146     len=0;
147     //a=" ";
148 }
149 bool MyString::empty() const
150 {
151     if(len==0)
152         return true;
153     else
154         return false;
155 }
156 
157 
158 int MyString::compare(const MyString& s) const
159 {
160     int m=this->len;int n=s.len;
161 
162     for(int i=0;i<m&&i<n;i++)
163     {
164         if(s.a[i]==a[i])
165             continue;
166         else if(s.a[i]<a[i])
167             return 1;
168         else
169             return -1;
170     }
171     return 0;
172 
173 
174 }
175 int MyString::compare(int index, int n, const MyString& s) const
176 {
177     int m=len,k=s.len;
178     if(index+n>m||index+n>k)
179     {
180         cout<<"cannot compare!"<<endl;
181         ///I dont know how to solve it
182     }
183     for(int i=index-1,j=0;i<n+index;i++,j++)
184     {
185         if(s.a[j]==a[i])
186             continue;
187         else if(s.a[j]<a[i])
188             return 1;
189         else
190             return -1;
191     }
192     return 0;
193 }
194 
195 
196 void MyString::copy(char s[], int index, int n)
197 {
198     if(n>=len)
199     {cout<<"the maximun array exceed"<<endl;}
200     else  if(n+index-1>len)
201     {
202         cout<<"the maximun array exceed"<<endl;
203         return;
204     }
205     else
206     {
207         for(int i=n-1,j=0;i<n+index-1;i++,j++)
208             s[j]=a[i];
209     }
210 
211 }
212 char* MyString::data() const
213 {
214     return a;
215 }
216 
217 
218 
219 
220 int MyString::find(char ch) const
221 {
222 
223     for(int i=0;i<len;i++)
224     {
225         if(ch==a[i])
226             return i+1;
227     }
228 
229     return 0;
230 }
231 int MyString::find(char ch, int index) const
232 {
233     if(index>len||index<1)
234     {
235         cout<<"the index num is should be  1~ "<<len<<endl;
236         return 0;
237     }
238     for(int i=index-1;i<len;i++)
239     {
240         if(ch==a[i])
241             return i+1;
242     }
243     return -1;
244 
245 }
246 
247 int MyString::find(const MyString& s, int index) const
248 {
249     if(index>s.len||index<1)
250     {
251         cout<<"the index num is should be  1~ "<<s.len<<endl;
252         return 0;
253     }
254     char ch=s.a[index-1];
255 
256     for(int i=0;i<len;i++)
257     {
258         if(ch==a[i])
259             return i+1;
260     }
261 
262     return 0;
263 }
264 
265 // 加法运算符重载
266 //MyString MyString::operator +(const MyString & another){
267 //    int len = strlen(this->a) + strlen(another.a);
268 //    MyString str("");
269 
270 //    delete []str.a;
271 //    str.a = new char[len + 1];
272 //    memset(str.a,0,len + 1);
273 //    //int len1 = strlen(this->a) + 1;
274 //    //strcat_s(str.a, len1, this->a);
275 //    strcat(str.a, this->a);
276 //    // 源串长度 + 目标串长度 + 结束符
277 //    //int len2 = strlen(this->a) + strlen(another.a) + 1;
278 //    //strcat_s(str.a,len2, another.a);
279 //    strcat(str.a, another.a);
280 //    return str;
281 //}
282 
283 //MyString MyString::operator +(const MyString &mystr){//mem leak
284 //    MyString newString("");
285 //    if (!mystr.a)
286 //     newString = *this;
287 //    else if (!a)
288 //     newString = mystr;
289 //    else {
290 //     newString.a = new char[strlen(a) + strlen(mystr.a) + 1];
291 //     strcpy(newString.a, a);
292 //     strcat(newString.a, mystr.a);
293 //    }
294 //    return newString;
295 //}
296 
297 //重载"+"运算符(不改变被加对象)
298 //MyString &MyString::operator +(const MyString &mystr){
299 //    MyString *temp=new MyString("");
300 //    temp->a=new char[strlen(a)+strlen(mystr.a)+1];
301 //    strcpy(temp->a,a);
302 //    strcat(temp->a,mystr.a);
303 //    return *temp;
304 //}
305 
306 
307 /*
308     //重载"+"运算符(改变被加对象)
309     Mystring &operator +(Mystring &mystr){
310         char *temp=str;
311         str=new char[strlen(temp)+strlen(mystr.str)+1];
312         strcpy(str,temp);
313         strcat(str,mystr.str);
314         delete [] temp;
315         return *this;
316     }
317     */
318 //friend
319 MyString operator +(const MyString& mystr1,const MyString &mystr2){
320     MyString str("");
321     delete[] str.a;
322     str.len =  strlen(mystr1.a)+strlen(mystr2.a);
323     str.a = new char[str.len + 1];
324     strcpy(str.a, mystr1.a);
325     strcat(str.a, mystr2.a);
326     return str;
327 
328     //    //MyString *temp=new MyString("");//mem leak
329     //    MyString temp("");
330     //    temp.a=new char[strlen(mystr1.a)+strlen(mystr2.a)+1];
331     //    //temp->a=new char[strlen(mystr1.a)+strlen(mystr2.a)+1];
332     //    strcpy(temp.a,mystr1.a);
333     //    strcat(temp.a,mystr2.a);
334     //    return temp;
335 }
336 
337 // ==关系运算符重载
338 bool MyString::operator==(const MyString &other)
339 {
340     if(strcmp(this->a,other.a) == 0)
341         return true;
342     else
343         return false;
344 }
345 // >关系运算符重载
346 bool MyString::operator>(const MyString &other)
347 {
348     if(strcmp(this->a,other.a) > 0)
349         return true;
350     else
351         return false;
352 }
353 // <运算符重载
354 bool MyString::operator<(const MyString &other)
355 {
356     if(strcmp(this->a,other.a) < 0)
357         return true;
358     else
359         return false;
360 }
361 // []运算符重载
362 char& MyString::operator[](int idx)
363 {
364     return a[idx];
365 }
366 
367 ostream& operator<<(ostream& os,const MyString& other){
368     return os << other.a;
369 }
370 
371 MyString &MyString::operator+=(const MyString &other)
372 {
373     int len = strlen(a) + strlen(other.a) + 1;
374     char *newstr = new char[len];
375     memset(newstr, 0, len);
376     strcpy(newstr, a);
377     strcat(newstr, other.a);
378 
379     delete[] a;
380 
381     a = newstr;
382     return *this;
383 }
384 
385 int main(){
386     MyString ms="hello";
387 
388     MyString mt("world");
389     mt += ms;
390     cout << mt << endl;
391     return 0;
392 }
View Code
原文地址:https://www.cnblogs.com/guxuanqing/p/5979133.html