实现说明:字符串类String的简单实现,内部采用字符数组实现

运行平台:VS2010

参考:http://rsljdkt.iteye.com/blog/770072

经验说明:拷贝构造函数、重载赋值运算符、实现析构函数三个操作在实现自定义类时往往同时出现。


Cpp代码 收藏代码
  1. #include <iostream>

  2. usingnamespace std;

  3. class String{

  4. public:

  5. String(constchar *str = NULL);//默认构造函数

  6. String(const String &str);//复制构造函数

  7. ~String();//析构函数

  8. String operator+(const String & str);//字符串连接

  9. String & operator=(const String &str);//字符串赋值

  10. bool operator==(const String &str);//判断是否字符串相等

  11. int Length();//获取字符串长度

  12. friend ostream & operator<<(ostream &o,const String &str);//重载输出

  13. String SubStr(int start, int end);//求子字符串(start ... end-1)

  14. private:

  15. char * charArray;

  16. };

  17. String::String(constchar *str)

  18. {

  19. if(str == NULL){

  20. charArray=newchar[1];

  21. charArray[0]='\0';

  22. }else{

  23. charArray=newchar[strlen(str)+1];

  24. strcpy(charArray,str);

  25. }

  26. }

  27. String::String(const String &str)

  28. {

  29. charArray = newchar[strlen(str.charArray)+1];

  30. strcpy(charArray,str.charArray);

  31. }

  32. String::~String()

  33. {

  34. delete [] charArray;

  35. }

  36. String String::operator+(const String &str)

  37. {

  38. String res;

  39. delete [] res.charArray;//释放原有空间

  40. res.charArray = newchar[strlen(charArray)+strlen(str.charArray)+1];

  41. strcpy(res.charArray,charArray);

  42. strcpy(res.charArray+strlen(charArray),str.charArray);

  43. return res;

  44. }

  45. String & String::operator=(const String &str)

  46. {

  47. if(charArray == str.charArray)

  48. return *this;

  49. delete [] charArray;

  50. charArray = newchar[strlen(str.charArray)+1];

  51. strcpy(charArray,str.charArray);

  52. return *this;

  53. }

  54. bool String::operator==(const String &str)

  55. {

  56. return strcmp(charArray,str.charArray) == 0;

  57. }

  58. int String::Length()

  59. {

  60. return strlen(charArray);

  61. }

  62. ostream & operator<<(ostream &o, const String &str)

  63. {

  64. o<<str.charArray;

  65. return o;

  66. }

  67. String String::SubStr(int start, int end)

  68. {

  69. String res;

  70. delete [] res.charArray;//释放原有内存

  71. res.charArray = newchar[end-start+1];//重新申请内存

  72. for(int i=0; i+start<end; i++){

  73. res.charArray[i]=charArray[start+i];

  74. }

  75. res.charArray[end-start] = '\0';

  76. return res;

  77. }

  78. void test()

  79. {

  80. String s = "abcd";

  81. String t = "abcd";

  82. cout<<s<<(s==t?" == ":" != ")<<t<<endl;

  83. String s2 = "Hello ";

  84. String s3 = "China!";

  85. cout<<s2+s3<<endl;

  86. cout<<(s2+s3).SubStr(0,s2.Length()+s3.Length())<<endl;

  87. }

  88. int main()

  89. {

  90. test();

  91. system("pause");

  92. }


运行结果:


Cpp代码 收藏代码
  1. abcd == abcd

  2. Hello China!

  3. Hello China!

  4. 请按任意键继续. . .