码迷,mamicode.com
首页 > 其他好文 > 详细

关于如何来构造一个String类

时间:2015-04-21 22:35:12      阅读:235      评论:0      收藏:0      [点我收藏+]

标签:

  今天帮着一位大二的学弟写了一个String的类,后来一想这个技术点,也许不是什么难点,但是还是简单的记录一些吧! 为那些还在路上爬行的行者,剖析一些基本的实现.....

  内容写的过于简单,没有涉及到其他格式的如考虑utf_8.这儿单纯的考虑了char的使用.......

     

  1 #define  _CRT_SECURE_NO_WARNINGS
  2 #include<iostream>
  3 #include<stdlib.h>
  4 #include<string.h>
  5 #include<windows.h>
  6 using namespace std;
  7 
  8 class MyString {
  9 
 10 public :
 11     MyString(const char * str = NULL) ;  //默认构造函数
 12     MyString(const MyString  & mystr);  //复制构造函数
 13     ~MyString() {
 14         if (test != NULL) delete[] test;
 15     };
 16         //析构函数
 17     int length();  //返回字符串长度
 18     void print();  //打印
 19     char at(int pos) ;  //查找第i个字符
 20     MyString & operator = (const MyString  &other); //等号操作符重载
 21    MyString & operator = (const  char  * str ); //等号操作符重载
 22 private:
 23     char * test;
 24 };
 25 
 26 //构造函数
 27 MyString::MyString(const  char * str) {
 28 
 29 
 30     if (str == NULL)
 31     {
 32         test = new char[1];
 33         *test = \0;
 34     }
 35     else
 36     {
 37         int length = strlen(str);
 38         test = new char[length + 1];
 39         strcpy(test, str);  //复制
 40     }
 41 }
 42 
 43 MyString::MyString(const MyString  & mystr)   //复制构造函数
 44 {
 45     char * pstr = mystr.test; 
 46     test = new char [strlen(pstr)+1];  //开辟空间
 47     strcpy(test, mystr.test);    //复制类容
 48 }
 49 
 50 //返回长度
 51 int MyString::length() {
 52     
 53     int i = 0;
 54     if (test == NULL) return 0;
 55     while (test[i] != \0) i++;
 56     return i;
 57 }
 58 
 59 void MyString::print() {
 60 
 61     if (test != NULL) {
 62         //printf("%s\n",test);
 63          puts(test);  //这样可以输出空格
 64     }
 65 }
 66 
 67 char MyString::at(int pos) {
 68 
 69     if (test != NULL) {
 70         int len = strlen(test);
 71         if (len <=pos) {
 72             throw out_of_range("位置超过字符串长度!");
 73         }
 74         else {
 75             return test[pos];
 76         }
 77     } {
 78         throw out_of_range("字符串为空!");
 79     }
 80 }
 81 
 82 MyString & MyString::operator =(const MyString & aa)
 83 {
 84     if (this == &aa)//当地址相同时,直接返回;
 85         return *this;
 86         delete[] test;//当地址不相同时,删除原来申请的空间,重新开始构造;
 87     int length = strlen(aa.test);
 88     test = new char [length + 1];
 89     strcpy(test, aa.test);
 90     return *this;
 91   
 92 }
 93 
 94 MyString & MyString::operator = (const  char  * str) //等号操作符重载
 95 {
 96 
 97     MyString  * ss = new MyString (str);
 98     return *ss;
 99 }
100 
101 
102 int main(){
103 
104     char *pp = "sadasd";
105     MyString  aa = "abcd";
106     aa.print();  //显示
107     cout << "长度为:" << aa.length();
108     cout << "显示abcd第二个元素的内容"<<aa.at(1)<<endl;
109     
110     MyString  *str = new MyString(pp);  //对于指针而言
111     str->print();
112     cout << "长度为:" << str->length();
113     cout << "显示sadasd第二个元素的内容" << str->at(1)<<endl;
114 
115     MyString  bb(aa);  //对于复制构造函数而言
116     bb.print();
117     cout << "长度为:" << bb.length();
118     cout << "显示abcd第二个元素的内容" << bb.at(1)<<endl;
119     str->print();
120     getchar();
121 }

对于这一点,后来又加深了一些基本模式,简略的实现以下String类吧!

  

  1 #define  _CRT_SECURE_NO_WARNINGS
  2 #include<iostream>
  3 #include<stdlib.h>
  4 #include<string.h>
  5 using namespace std;
  6 
  7 template < typename  T >
  8 
  9 class MyString {
 10 
 11 public :
 12 
 13     MyString(const T * str = NULL) ;
 14         //默认构造函数
 15     MyString(const MyString<T>  & mystr);  //复制构造函数
 16     ~MyString() {
 17         if (test != NULL) delete[] test;
 18     };
 19         //析构函数
 20     int length();  //返回字符串长度
 21     void print();  //打印
 22     T at(int pos);
 23     MyString<T> & operator + (const MyString<T>  &aa); //等号操作符重载
 24     MyString<T> & operator + (const  T  * str); //等号操作符重载
 25     MyString<T> & operator = (const MyString<T>  &aa); //等号操作符重载
 26     MyString<T> & operator = (const  T  * str );     //等号操作符重载
 27 
 28 private:
 29     T * test;
 30 
 31 };
 32 
 33 template < typename  T >
 34 MyString<T> &  MyString<T>::operator + (const MyString<T>  &aa) {
 35     
 36     T  *str =test;
 37     int lena = -1 , lenb=-1;
 38        lena=strlen(aa.test);
 39        lenb = strlen(test);
 40        if (lena> 0) {
 41            test = new T[lena+lenb];
 42            strcpy(test, strcat(str, aa.test));
 43 
 44        }
 45        return *this;
 46 }
 47 
 48 
 49 template < typename  T >
 50 MyString<T> & MyString<T>::operator + (const T * str) {
 51 
 52     T  * str = test;
 53     int lena = -1, lenb = -1;
 54     lena = strlen(str);
 55     lenb = strlen(test);
 56     if (lena > 0) {
 57             test = new T[lena + lenb];
 58         strncpy(test, strcat(str, str));
 59     }
 60     return *this;
 61 }
 62 
 63 //构造函数
 64 template < typename  T >
 65 MyString<T>::MyString(const  T * str) {
 66 
 67 
 68     if (str == NULL)
 69     {
 70         test = new T[1];
 71         *test = \0;
 72     }
 73     else
 74     {
 75         int length = strlen(str);
 76         test = new T[length + 1];
 77         strcpy(test, str);  //复制
 78     }
 79 }
 80 
 81 template < typename  T >
 82 MyString<T>::MyString(const MyString<T>  & mystr)   //复制构造函数
 83 {
 84     T * pstr = mystr.test; 
 85     test = new T [strlen(pstr)+1];  //开辟空间
 86     strcpy(test, mystr.test);    //复制类容
 87 }
 88 
 89 //返回长度
 90 template < typename  T >
 91 int MyString<T>::length() {
 92     
 93     int i = 0;
 94     if (test == NULL) return 0;
 95     while (test[i] != \0) i++;
 96     return i;
 97 }
 98 template < typename  T >
 99 void MyString<T>::print() {
100 
101     if (test != NULL) {
102         //printf("%s\n",test);
103          puts(test);  //这样可以输出空格
104     }
105 }
106 template < typename  T >
107 T MyString<T>::at(int pos) {
108 
109     if (test != NULL) {
110         int len = strlen(test);
111         if (len <=pos) {
112             throw out_of_range("位置超过字符串长度!");
113         }
114         else {
115             return test[pos];
116         }
117     } {
118         throw out_of_range("字符串为空!");
119     }
120 }
121 
122 template < typename  T >
123 MyString<T> & MyString<T>::operator =(const MyString<T> & aa)
124 {
125     if (this == &aa)//当地址相同时,直接返回;
126         return *this;
127         delete[] test;//当地址不相同时,删除原来申请的空间,重新开始构造;
128     int length = strlen(aa.test);
129     test = new T [length + 1];
130     strcpy(test, aa.test);
131     return *this;
132   
133 }
134 
135 template < typename  T >
136 MyString<T> & MyString<T>::operator = (const  T  * str) //等号操作符重载
137 {
138 
139     MyString<T>  * ss = new MyString<T> (str);
140     return *ss;
141 }
142 
143 
144 int main(){
145 
146     char *pp = "sadasd";
147     MyString<char> aa = "abcd";
148     aa.print();  //显示
149     cout << "长度为:" << aa.length();
150     cout << "显示abcd第二个元素的内容"<<aa.at(1)<<endl;
151     
152     MyString<char>  *str = new MyString<char>(pp);  //对于指针而言
153     str->print();
154     cout << "长度为:" << str->length();
155     cout << "显示sadasd第二个元素的内容" << str->at(1)<<endl;
156 
157     MyString<char>  bb(aa);  //对于复制构造函数而言
158     bb.print();
159     cout << "长度为:" << bb.length();
160     cout << "显示abcd第二个元素的内容" << bb.at(1)<<endl;
161     str->print();
162     MyString<char>  sc="你好,北京人";
163     sc.print();
164     sc = sc + bb;
165     sc.print();
166     getchar();
167     return 0;
168 }

以后有时间,再来写写吧! 

关于如何来构造一个String类

标签:

原文地址:http://www.cnblogs.com/gongxijun/p/4445576.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!