C++笔记4.63

强化字符串string类源代码

mystring.h

  1. #ifndef MYSTRING_H  
  2. #define MYSTRING_H  
  3. #include <iostream>  
  4.   
  5. using namespace std;  
  6.   
  7. class mystring  
  8. {  
  9.     friend ostream& operator<<(ostream &out,mystring &ob);  
  10.     friend istream& operator>>(istream &in,mystring &ob);  
  11. private:  
  12.     char *str;  
  13.     int size;  
  14. public:  
  15.     mystring();  
  16.     mystring(const char *str);  
  17.     mystring(const mystring &ob);  
  18.     ~mystring();  
  19.     int getSize(void);  
  20.     //重载[]运算符返回值必须是左值才能用写操作  
  21.     char& operator[](int index);  
  22.     mystring& operator=(const mystring &ob);  
  23.     mystring& operator=(const char *str);  
  24.     mystring& operator+(const mystring &ob);  
  25.     mystring& operator+(const char *str);  
  26.     bool operator==(const mystring &ob);  
  27.     bool operator==(const char *str);  
  28.     bool operator!=(const mystring &ob);  
  29.     bool operator!=(const char *str);  
  30. };  
  31.   
  32. #endif // MYSTRING_H  

mystring.cpp

  1. #include "mystring.h"  
  2. #include<iostream>  
  3. #include<cstring>  
  4.   
  5. using namespace std;  
  6.   
  7. mystring::mystring()  
  8. {  
  9.     this -> str = NULL;  
  10.     this -> size = 0;  
  11.     cout << "无参构造" << endl;  
  12. }  
  13. mystring::mystring(const char *str)  
  14. {  
  15.     cout << "char* 构造函数" << endl;  
  16.     this->str = new char [strlen(str)+1];  
  17.     strcpy(this->str,str);  
  18.   
  19.     this->size = strlen(str);  
  20. }  
  21.   
  22. mystring::mystring(const mystring &ob)  
  23. {  
  24.     cout << "char* 构造函数" << endl;  
  25.     this->str = new char [strlen(ob.str)+1];  
  26.     strcpy(this->str,ob.str);  
  27.   
  28.     this->size = ob.size;  
  29. }  
  30. mystring::~mystring()  
  31. {  
  32.     if (this->str != NULL)  
  33.     {  
  34.         delete []this->str;  
  35.         this->str = NULL;  
  36.         this->size = 0;  
  37.     }  
  38.     cout << "析构函数" << endl;  
  39. }  
  40.   
  41. ostream& operator<<(ostream &out,mystring &ob)  
  42. {  
  43.     out << ob.str;  
  44.     return out;  
  45. }  
  46.   
  47. istream& operator>>(istream &in,mystring &ob)  
  48. {  
  49.     if(ob.str != NULL)  
  50.     {  
  51.         delete [] ob.str;  
  52.         ob.str = NULL;  
  53.     }  
  54.     char buf[1024] = "";//临时buf  
  55.     in >> buf;  
  56.   
  57.     ob.str = new char[strlen(buf)+1];  
  58.     strcpy(ob.str,buf);  
  59.     ob.size = strlen(buf);  
  60.   
  61.     return in;  
  62. }  
  63.   
  64. int mystring::getSize(void)  
  65. {  
  66.     return this->size;  
  67. }  
  68.   
  69. char& mystring::operator[](int index)  
  70. {  
  71.     if(index >= 0 && index <= this->size)  
  72.     {  
  73.         return this->str[index];  
  74.     }  
  75.   
  76.     else  
  77.     {  
  78.         cout << "index无效" << endl;  
  79.     }  
  80. }  
  81.   
  82. mystring& mystring::operator=(const mystring &ob)  
  83. {  
  84.     if(this->str != NULL)  
  85.     {  
  86.         delete [] this->str;  
  87.         this-> str = NULL;  
  88.         this-> size = 0;  
  89.     }  
  90.   
  91.     this->str = new char[ob.size+1];  
  92.     strcpy(this->str,ob.str);  
  93.     this->size = ob.size;  
  94.     return *this;  
  95. }  
  96.   
  97. mystring& mystring::operator=(const char *str)  
  98. {  
  99.     if(this->str != NULL)  
  100.     {  
  101.         delete [] this->str;  
  102.         this-> str = NULL;  
  103.         this-> size = 0;  
  104.     }  
  105.   
  106.     this->str = new char[strlen(str)+1];  
  107.     strcpy(this->str,str);  
  108.     this->size = strlen(str);  
  109.     return*this;  
  110. }  
  111.   
  112. mystring& mystring::operator+(const mystring &ob)  
  113. {  
  114.     int newSize = this->size + ob.size +1;  
  115.     char *tmp_str = new char [newSize];  
  116.     //清空tmp_str所指向的空间  
  117.     memset(tmp_str,0,newSize);  
  118.     //先将this->str拷贝到tmp_str中,然后ob.str追加到tmp_str中  
  119.     strcpy(tmp_str,this->str);  
  120.     strcat(tmp_str,ob.str);  
  121.   
  122.     static mystring newString(tmp_str);  
  123.     //释放tmp_str指向的临时空间  
  124.     if(tmp_str != NULL)  
  125.     {  
  126.         delete [] tmp_str;  
  127.         tmp_str = NULL;  
  128.     }  
  129.   
  130.     return newString;  
  131. }  
  132.   
  133. mystring& mystring::operator+(const char *str)  
  134. {  
  135.     int newSize = this->size + strlen(str) +1;  
  136.     char *tmp_str = new char [newSize];  
  137.     //清空tmp_str所指向的空间  
  138.     memset(tmp_str,0,newSize);  
  139.     //先将this->str拷贝到tmp_str中,然后str指向的字符串追加到tmp_str中  
  140.     strcpy(tmp_str,this->str);  
  141.     strcat(tmp_str,str);  
  142.   
  143.     static mystring newString(tmp_str);  
  144.     //释放tmp_str指向的临时空间  
  145.     if(tmp_str != NULL)  
  146.     {  
  147.         delete [] tmp_str;  
  148.         tmp_str = NULL;  
  149.     }  
  150.   
  151.     return newString;  
  152. }  
  153.   
  154. bool mystring::operator==(const mystring &ob)  
  155. {  
  156.     if((strcmp(this->str,ob.str) == 0) && (this->size == ob.size))  
  157.     {  
  158.         return true;  
  159.     }  
  160.   
  161.     return false;  
  162. }  
  163. bool mystring::operator==(const char *str)  
  164. {  
  165.     if((strcmp(this->str,str) == 0) && (this->size == strlen(str)))  
  166.     {  
  167.         return true;  
  168.     }  
  169.   
  170.     return false;  
  171. }  
  172.   
  173. bool mystring::operator!=(const mystring &ob)  
  174. {  
  175.     if((strcmp(this->str,ob.str) == 0) && (this->size == ob.size))  
  176.     {  
  177.         return false;  
  178.     }  
  179.   
  180.     return true;  
  181. }  
  182. bool mystring::operator!=(const char *str)  
  183. {  
  184.     if((strcmp(this->str,str) == 0) && (this->size == strlen(str)))  
  185.     {  
  186.         return false;  
  187.     }  
  188.   
  189.     return true;  
  190. }  

main.cpp

  1. #include <iostream>  
  2. #include"mystring.h"  
  3. using namespace std;  
  4.   
  5. int main()  
  6. {  
  7.     mystring str1("Happy birthday");  
  8.     mystring str2;  
  9.     mystring str3;  
  10.     mystring str4;  
  11.     str2 = str1;  
  12.     str3 = " ZY";  
  13.     cout << "str1: " << str1 << endl;  
  14.     cout << "str2: " <<str2 << endl;  
  15.     cout << "str1 和 str2 ";  
  16.     if (str1 == str2){cout << "相等" <<endl;}  
  17.     else{cout << "不相等" << endl;}  
  18.     cout << "将str1 的 " << str1[6] << " 改成大写:" ;  
  19.     str1[6] = 'B';  
  20.     cout << str1 << endl;  
  21.     if (str1 != str2){cout << "不相等" <<endl;}  
  22.     else{cout << "相等" << endl;}  
  23.     str4 = str1 + str3;  
  24.     cout << str4 << endl;  
  25.     return 0;  
  26. }  

发表评论

邮箱地址不会被公开。 必填项已用*标注