zoukankan      html  css  js  c++  java
  • 字符串(string类)

    【1】String类基本函数如何实现?

    示例代码如下:

      1 #include <iostream>
      2 #include <assert.h>
      3 #include <string>
      4 using namespace std;
      5 
      6 class String
      7 {
      8 public:
      9     String(const char *str = NULL);  // 复合默认构造函数
     10     String(const String &other);     // 拷贝构造函数
     11     String & operator=(const String &other);  // 赋值构造函数
     12     String operator+(const String &s1);       // 双目运算符重载
     13     ~String();                                // 析构函数
     14     void PrintData() const;
     15     
     16 private:
     17     char *m_data;   //指针成员变量
     18 };
     19 
     20 String::String(const char *str)
     21  {
     22     cout << "Construction" << endl;
     23     if (NULL == str)
     24     {
     25         m_data = new char[1];
     26         assert(m_data != NULL);
     27         *m_data = '\0';
     28     }
     29     else
     30     {
     31         int length = strlen(str);
     32         m_data = new char[length + 1];
     33         assert(m_data != NULL);
     34         strcpy(m_data, str);
     35     }
     36 }
     37 
     38  String::String(const String &other)
     39  {
     40     cout << "Copy   Construction" << endl;
     41     int length = strlen(other.m_data);
     42     m_data = new char[length + 1];
     43     assert(m_data != NULL);
     44     strcpy(m_data, other.m_data);
     45 }
     46 
     47 String & String::operator=(const String &other)
     48  {
     49     cout << "= Construction" << endl;
     50     if (this == &other)
     51     {
     52         return *this;
     53     }
     54     delete []m_data;
     55     int length = strlen(other.m_data);
     56     m_data = new char[length + 1];
     57     assert(m_data != NULL);
     58     strcpy(m_data, other.m_data);
     59     return  *this;
     60 }
     61 
     62 String String::operator+(const String &s1)
     63 {
     64     cout << "+ operator" << endl;
     65     String temp;
     66     delete []temp.m_data;
     67     temp.m_data = new char[strlen(m_data) + strlen(s1.m_data) + 1];
     68     strcpy(temp.m_data, m_data);
     69     strcat(temp.m_data, s1.m_data);
     70     return temp;
     71     
     72 }
     73 
     74 void String::PrintData() const
     75 {
     76     cout << m_data << endl;
     77 }
     78 
     79 String::~String()
     80 {
     81     delete []m_data;
     82 }
     83 
     84 void  main()
     85 {
     86     String s1;             // 默认
     87     s1.PrintData();
     88     
     89     String s2("Liuyong");  // 构造函数
     90     s2.PrintData();
     91     
     92     String s3 = "abcde";   // 隐式转换
     93     s3.PrintData();
     94 
     95     String s4(s3);       // 拷贝构造
     96     s4.PrintData();
     97 
     98     String s5;
     99     s5 = s4;               // 赋值构造
    100     s5.PrintData();
    101 
    102     String s6 = s2 + s3;     //+operator
    103     s6.PrintData();
    104 
    105     system("pause");
    106 }
    107  //run out:
    108  /*
    109 Construction
    110 
    111 Construction
    112 Liuyong
    113 Construction
    114 abcde
    115 Copy   Construction
    116 abcde
    117 Construction
    118 = Construction
    119 abcde
    120 + operator
    121 Construction
    122 Copy   Construction
    123 Liuyongabcde
    124 请按任意键继续. . .
    125 */

    上面是string类的部分函数实现,具体实现了构造函数,拷贝构造函数,赋值构造函数,析构函数,以及实现了深拷贝的示范。

    【2】String类详细实现(原旧版本)

      1 #include <cassert>
      2 #include <string>
      3 #include <iostream>
      4 using namespace std;
      5 
      6 class String
      7 {
      8 public:
      9     String();
     10     String(int n, char c);
     11     String(const char *source);
     12     String(const String &s);
     13     String & operator=(char *s);
     14     String & operator=(const String &s);
     15     ~String();
     16     char &operator[](int i);
     17     const char &operator[](int i)const;
     18     String &operator+=(const String &s);
     19     String &operator+=(const char *s);
     20     friend ostream & operator<<(ostream &out, String &s);
     21     friend istream & operator>>(istream &in, String &s);
     22     friend bool operator<(const String &left, const String &right);
     23     friend bool operator>(const String &left, const String &right);
     24     friend bool operator==(const String &left, const String &right);
     25     friend bool operator!=(const String &left, const String &right);
     26     int length();
     27     char *GetData();
     28 
     29 private:
     30     int size;
     31     char *data;
     32 };
     33 
     34 String::String()
     35 {
     36     data = new char[1];
     37     assert(data != NULL);
     38     *data = '\0';
     39     size = 0;
     40 }
     41 
     42 String::String(int n, char c)
     43 {
     44     data = new char[n + 1];
     45     assert(data != NULL);
     46     size = n;
     47     char *temp = data;
     48     while (n--)
     49     {
     50         *temp++ = c;
     51     }
     52     *temp = '\0';
     53 }
     54 String::String(const char *source)
     55 {
     56     if (NULL == source)
     57     {
     58         data = new char[1];
     59         assert(data != NULL);
     60         *data = '\0';
     61         size = 0;
     62     }
     63     else
     64     {
     65         size = strlen(source);
     66         data = new char[size + 1];
     67         assert(data != NULL);
     68         strcpy(data, source);
     69     }
     70 }
     71 String::String(const String &s)
     72 {
     73     data = new char[s.size + 1];
     74     assert(data != NULL);
     75     strcpy(data, s.data);
     76     size = s.size;
     77 }
     78 
     79 String & String::operator=(char *s)
     80 {
     81     if (data != NULL)
     82     {
     83         delete []data;
     84     }
     85     size = strlen(s);
     86     data = new char[size + 1];
     87     assert(data != NULL);
     88     strcpy(data, s);
     89     return *this;
     90 }
     91 
     92 String &String::operator=(const String &s)
     93 {
     94     if (this == &s)
     95     {
     96         return *this;
     97     }
     98     if (data != NULL)
     99     {
    100         delete []data;
    101     }
    102     size = strlen(s.data);
    103     data = new char[size + 1];
    104     assert(data != NULL);
    105     strcpy(data, s.data);
    106     return *this;
    107 }
    108 
    109 String::~String()
    110 {
    111     if (data != NULL)
    112     {
    113         delete []data;
    114         data = NULL;
    115         size = 0;
    116     }
    117 }
    118 
    119 char &String::operator[](int i)
    120 {
    121     return data[i];
    122 }
    123 
    124 const char &String::operator[](int i)const 
    125 {
    126     return data[i];
    127 }
    128 
    129 String &String::operator+=(const String &s)
    130 {
    131     int len = size + s.size + 1;
    132     char *pTemp = data;
    133     data = new char[len];
    134     assert(data != NULL);
    135     size = len - 1;
    136     strcpy(data, pTemp);
    137     strcat(data, s.data);
    138     delete []pTemp;
    139     return *this;
    140 }
    141 
    142 String & String::operator+=(const char *s)
    143 {
    144     if (NULL == s)
    145     {
    146         return *this;
    147     }
    148     int len = size + strlen(s) + 1;
    149     char *pTemp = data;
    150     data = new char[len];
    151     assert(data != NULL);
    152     size = len - 1;
    153     strcpy(data, pTemp);
    154     strcat(data, s);
    155     delete []pTemp;
    156     return  *this;
    157 }
    158 
    159 int String::length()
    160 {
    161     return size;
    162 }
    163 
    164 ostream & operator<<(ostream &out, String &s)
    165 {
    166     for (int i = 0;i < s.length();i++)
    167     {
    168         out << s[i] << " ";
    169     }
    170     return out;
    171 }
    172 
    173 istream & operator>>(istream &in, String &s)
    174 {
    175     char p[50];
    176     in.getline(p, 50);
    177     s = p;
    178     return in;
    179 }
    180 
    181 bool operator<(const String &left, const String &right)
    182 {
    183     int i = 0;
    184     while (left[i] == right[i] && left[i] != 0 && right[i] != 0)
    185     {
    186         i++;
    187     }
    188     return left[i] - right[i] <0 ? true : false;
    189 }
    190 
    191 bool operator>(const String &left, const String &right)
    192 {
    193     int i = 0;
    194     while (left[i] == right[i] && left[i] != 0 && right[i] != 0)
    195     {
    196         i++;
    197     }
    198     return left[i] - right[i] > 0 ? true : false;
    199 }
    200 
    201 bool operator ==(const String &left, const String &right)
    202 {
    203     int i = 0;
    204     while (left[i] == right[i] && left[i] != 0 && right[i] != 0)
    205     {
    206         i++;
    207     }
    208     return (left[i] == right[i]) ? true : false ;
    209 }
    210 
    211 bool operator !=(const String &left, const String &right)
    212 {
    213     int i = 0;
    214     while (left[i] == right[i] && left[i] != 0 && right[i] != 0)
    215     {
    216         i++;
    217     }
    218     return (left[i] == right[i]) ?  false : true;
    219 }
    220 
    221 void main()
    222 {
    223     String str(3,'a');
    224     String str1(str);
    225     String str2("asdf");
    226     String str3;
    227 
    228     cout << "str: " << str << endl;
    229     cout << "str1: " << str1 << endl;
    230     cout << "str2: " << str2 << endl;
    231     cout << "str3: " << str3 << endl;
    232 
    233     str3 = str2;
    234     cout << "str2: " << str2 << endl;
    235     cout << "str3: " << str3 << endl;
    236 
    237     str3 = "12awee";
    238     cout << "str3: " << str3 << endl;
    239 
    240     cout << "str3[2]= " << str3[2] << endl;
    241 
    242     str3 += "1234";
    243     cout << "str3: " << str3 << endl;
    244 
    245     str3 += str1;
    246     cout << "str3: " << str3 << endl;
    247 
    248     String t1 = "1234";
    249     String t2 = "1234";
    250     String t3 = "12345";
    251     String t4 = "12335";
    252 
    253     cout << "t1 == t2 ? " << (t1 == t2) << endl;
    254     cout << "t1 < t3 ? " << (t1 < t3) << endl;
    255     cout << "t1 > t4 ? " << (t1 > t4) << endl;
    256     cout << "t1 != t4 ? " << (t1 != t4) << endl;
    257 
    258     system("pause");
    259 }
    260 // run out:
    261 /*
    262 str: a a a
    263 str1: a a a
    264 str2: a s d f
    265 str3:
    266 str2: a s d f
    267 str3: a s d f
    268 str3: 1 2 a w e e
    269 str3[2]= a
    270 str3: 1 2 a w e e 1 2 3 4
    271 str3: 1 2 a w e e 1 2 3 4 a a a
    272 t1 == t2 ? 1
    273 t1 < t3 ? 1
    274 t1 > t4 ? 1
    275 t1 != t4 ? 1
    276 请按任意键继续. . .
    277 */

    【3】String类详细实现(最新版本)(C++11后)

    VS2017环境下

      1 #include <cassert>
      2 #include <string>
      3 #include <iostream>
      4 using namespace std;
      5 
      6 class String
      7 {
      8 public:
      9     String();
     10     String(int n, char c);
     11     String(const char *source);
     12     String(const String &s);
     13     String(String && s);
     14     String & operator=(char *s);
     15     String & operator=(const String &s);
     16     String & operator=(String &&s);
     17     ~String();
     18 
     19     char &operator[](int i);
     20     const char &operator[](int i) const;
     21     String &operator+=(const String &s);
     22     String &operator+=(const char *s);
     23     
     24     friend ostream & operator<<(ostream &out, String &s);
     25     friend istream & operator>>(istream &in, String &s);
     26     friend bool operator<(const String &left, const String &right);
     27     friend bool operator>(const String &left, const String &right);
     28     friend bool operator==(const String &left, const String &right);
     29     friend bool operator!=(const String &left, const String &right);
     30 
     31     int getSize() const;
     32     void setSize(int nSize);
     33     char* getData() const;
     34     void setData(char *pData);
     35 
     36 private:
     37     void init();
     38 
     39 private:
     40     int m_size;
     41     char *m_data;
     42 };
     43 
     44 void String::init()
     45 {
     46     m_data = new char[1];
     47     assert(m_data != NULL);
     48     *m_data = '\0';
     49     m_size = 0;
     50 }
     51 
     52 String::String()
     53 {
     54     init();
     55 }
     56 
     57 String::String(int n, char c)
     58 {
     59     m_data = new char[n + 1];
     60     assert(m_data != NULL);
     61     m_size = n;
     62     char *temp = m_data;
     63     while (n--)
     64     {
     65         *temp++ = c;
     66     }
     67     *temp = '\0';
     68 }
     69 
     70 String::String(const char *source)
     71 {
     72     if (NULL == source)
     73     {
     74         init();
     75     }
     76     else
     77     {
     78         m_size = strlen(source);
     79         m_data = new char[m_size + 1];
     80         assert(m_data != NULL);
     81         strcpy_s(m_data, (m_size + 1), source);
     82     }
     83 }
     84 String::String(const String &s)
     85 {
     86     m_data = new char[s.m_size + 1];
     87     assert(m_data != NULL);
     88     strcpy_s(m_data, (s.m_size + 1), s.m_data);
     89     m_size = s.m_size;
     90 }
     91 
     92 String::String(String &&s)
     93 {
     94     cout << "call move ctor" << endl;
     95     m_data = s.getData();
     96     m_size = s.getSize();
     97     s.setData(NULL);
     98     s.setSize(0);
     99 }
    100 
    101 String & String::operator=(char *s)
    102 {
    103     if (m_data != NULL)
    104     {
    105         delete []m_data;
    106     }
    107     m_size = strlen(s);
    108     m_data = new char[m_size + 1];
    109     assert(m_data != NULL);
    110     strcpy_s(m_data, (m_size + 1), s);
    111     return (*this);
    112 }
    113 
    114 String &String::operator=(const String &s)
    115 {
    116     if (this == &s)
    117     {
    118         return *this;
    119     }
    120     if (m_data != NULL)
    121     {
    122         delete []m_data;
    123     }
    124     m_size = strlen(s.m_data);
    125     m_data = new char[m_size + 1];
    126     assert(m_data != NULL);
    127     strcpy_s(m_data, (m_size + 1), s.m_data);
    128     return (*this);
    129 }
    130 
    131 String & String::operator=(String &&s)
    132 {
    133     cout << "call move operator=" << endl;
    134     if (this == &s)
    135     {
    136         return (*this);
    137     }
    138     if (m_data != NULL)
    139     {
    140         delete []m_data;
    141     }
    142     m_data = s.getData();
    143     m_size = s.getSize();
    144     s.setData(NULL);
    145     s.setSize(0);
    146     return (*this);
    147 }
    148 
    149 String::~String()
    150 {
    151     if (m_data != NULL)
    152     {
    153         delete []m_data;
    154         m_data = NULL;
    155         m_size = 0;
    156     }
    157 }
    158 
    159 char &String::operator[](int i)
    160 {
    161     return m_data[i];
    162 }
    163 
    164 const char &String::operator[](int i) const
    165 {
    166     return m_data[i];
    167 }
    168 
    169 String &String::operator+=(const String &s)
    170 {
    171     int len = m_size + s.m_size + 1;
    172     char *pTemp = m_data;
    173     m_data = new char[len];
    174     assert(m_data != NULL);
    175     strcpy_s(m_data, (m_size + 1), pTemp);
    176     strcat_s(m_data, len, s.m_data);
    177     m_size = len - 1;
    178     delete []pTemp;
    179     return (*this);
    180 }
    181 
    182 String & String::operator+=(const char *s)
    183 {
    184     if (NULL == s)
    185     {
    186         return (*this);
    187     }
    188     int len = m_size + strlen(s) + 1;
    189     char *pTemp = m_data;
    190     m_data = new char[len];
    191     assert(m_data != NULL);
    192     strcpy_s(m_data, (m_size + 1), pTemp);
    193     strcat_s(m_data, len, s);
    194     m_size = len - 1;
    195     delete []pTemp;
    196     return (*this);
    197 }
    198 
    199 int String::getSize() const
    200 {
    201     return m_size;
    202 }
    203 
    204 void String::setSize(int nSize)
    205 {
    206     this->m_size = nSize;
    207 }
    208 
    209 char* String::getData() const
    210 {
    211     return m_data;
    212 }
    213 
    214 void String::setData(char *pData)
    215 {
    216     if (NULL == pData)
    217     {
    218         init();
    219     }
    220     else
    221     {
    222         m_data = pData;
    223     }
    224 }
    225 
    226 ostream & operator<<(ostream &out, String &s)
    227 {
    228     for (int i = 0; i < s.getSize(); ++i)
    229     {
    230         out << s[i] << " ";
    231     }
    232     return out;
    233 }
    234 
    235 istream & operator>>(istream &in, String &s)
    236 {
    237     char p[50];
    238     in.getline(p, 50);
    239     s = p;
    240     return in;
    241 }
    242 
    243 bool operator<(const String &left, const String &right)
    244 {
    245     int i = 0;
    246     while (left[i] == right[i] && left[i] != 0 && right[i] != 0)
    247     {
    248         i++;
    249     }
    250     return (left[i] - right[i] < 0);
    251 }
    252 
    253 bool operator>(const String &left, const String &right)
    254 {
    255     int i = 0;
    256     while (left[i] == right[i] && left[i] != 0 && right[i] != 0)
    257     {
    258         i++;
    259     }
    260     return (left[i] - right[i] > 0);
    261 }
    262 
    263 bool operator==(const String &left, const String &right)
    264 {
    265     int i = 0;
    266     while (left[i] == right[i] && left[i] != 0 && right[i] != 0)
    267     {
    268         i++;
    269     }
    270     return (left[i] == right[i]);
    271 }
    272 
    273 bool operator!=(const String &left, const String &right)
    274 {
    275     int i = 0;
    276     while (left[i] == right[i] && left[i] != 0 && right[i] != 0)
    277     {
    278         i++;
    279     }
    280     return (left[i] != right[i]);
    281 }
    282 
    283 int main()
    284 {
    285     String str(3, 'a');
    286     String str1(str);
    287     String str2("asdf");
    288     String str3;
    289     cout << "str: " << str << endl;
    290     cout << "str1: " << str1 << endl;
    291     cout << "str2: " << str2 << endl;
    292     cout << "str3: " << str3 << endl;
    293 
    294     // 赋值
    295     str3 = str2;
    296     cout << "str2: " << str2 << endl;
    297     cout << "str3: " << str3 << endl;
    298 
    299     // 移动赋值
    300     str3 = "12awee";  // call move operator=
    301     cout << "str3: " << str3 << endl;
    302     cout << "str3[2]= " << str3[2] << endl;
    303 
    304     str3 += "1234";
    305     cout << "str3: " << str3 << endl;
    306 
    307     str3 += str1;
    308     cout << "str3: " << str3 << endl;
    309     
    310     // 移动构造函数
    311     String str4(move(str2));  // call move ctor
    312     cout << "str4: " << str4 << endl;
    313 
    314     // 移动赋值
    315     String str5;
    316     str5 = move(str3); // call move operator=
    317     cout << "str5: " << str5 << endl;
    318 
    319     // 比较
    320     String t1 = "1234";
    321     String t2 = "1234";
    322     String t3 = "12345";
    323     String t4 = "12335";
    324     cout << "t1 == t2 ? " << (t1 == t2) << endl;
    325     cout << "t1 < t3 ? " << (t1 < t3) << endl;
    326     cout << "t1 > t4 ? " << (t1 > t4) << endl;
    327     cout << "t1 != t4 ? " << (t1 != t4) << endl;
    328 
    329     // 输入
    330     String strInput;
    331     cout << "Please input string " << endl;
    332     cin >> strInput;
    333     cout << "strInput: " << strInput << endl;
    334 
    335     system("pause");
    336 }
    337 
    338 // run out:
    339 /*
    340 str: a a a
    341 str1: a a a
    342 str2: a s d f
    343 str3:
    344 str2: a s d f
    345 str3: a s d f
    346 call move operator=
    347 str3: 1 2 a w e e
    348 str3[2]= a
    349 str3: 1 2 a w e e 1 2 3 4
    350 str3: 1 2 a w e e 1 2 3 4 a a a
    351 call move ctor
    352 str4: a s d f
    353 call move operator=
    354 str5: 1 2 a w e e 1 2 3 4 a a a
    355 t1 == t2 ? 1
    356 t1 < t3 ? 1
    357 t1 > t4 ? 1
    358 t1 != t4 ? 1
    359 Please input string
    360 kaizen
    361 strInput: k a i z e n
    362 请按任意键继续. . .
    363 */

    Good Good Study,Day Day Up.

    顺序 选择 循环 总结

    作者:kaizen
    声明:本文版权归作者和博客园共有,欢迎转载。但未经作者同意必须保留此声明,且在文章明显位置给出本文链接,否则保留追究法律责任的权利。
    签名:顺序 选择 循环
  • 相关阅读:
    图灵5月书讯※特别制作【MongoDB将在5月中旬隆重上市】
    让你学会狂妄懂得谦卑的书
    一千个读者,一千个不同的编程人生
    松本行弘为什么开发Ruby
    在Flex控件中使用XMLListCollection
    32位系统部署到64位下常见问题及解决
    win7系统的IIS服务器如何解除上传200k限制
    Asp.net单点登录解决方案
    Web.Config加密【转】
    在IIS8添加WCF服务支持
  • 原文地址:https://www.cnblogs.com/Braveliu/p/2840822.html
Copyright © 2011-2022 走看看