fork download
  1. #include <iostream>
  2. using std::cout;
  3. using std::endl;
  4.  
  5. #include <cstring>
  6.  
  7. struct String
  8. {
  9. char *buf;
  10. size_t len;
  11.  
  12. String()
  13. {
  14. len = 0U;
  15. buf = new char[1U];
  16.  
  17. *buf = '\0';
  18. }
  19.  
  20. String( const char *cstr )
  21. {
  22. len = strlen( cstr );
  23.  
  24. buf = new char[len + 1U];
  25.  
  26. memcpy( buf, cstr, len + 1U );
  27. }
  28.  
  29. String( const String &str )
  30. {
  31. len = str.length();
  32.  
  33. buf = new char[len + 1U];
  34.  
  35. memcpy( buf, str.buf, len + 1U );
  36. }
  37.  
  38. String &operator=( const String &rhs )
  39. {
  40. if( this != &rhs )
  41. {
  42. this->~String();
  43.  
  44. len = rhs.length();
  45.  
  46. buf = new char[len + 1U];
  47.  
  48. memcpy( buf, rhs.buf, len + 1U );
  49. }
  50.  
  51. return *this;
  52. }
  53.  
  54. String operator+( const String &rhs ) const
  55. {
  56. String tmp;
  57.  
  58. tmp.~String();
  59.  
  60. tmp.len = this->length() + rhs.length();
  61. tmp.buf = new char[tmp.len + 1U];
  62.  
  63. memcpy( tmp.buf, this->buf, this->length() + 1U );
  64. strcat( tmp.buf, rhs.buf );
  65.  
  66. return tmp;
  67. }
  68.  
  69. size_t length() const
  70. {
  71. return len;
  72. }
  73.  
  74. ~String()
  75. {
  76. delete [] buf;
  77.  
  78. len = 0U;
  79. }
  80. };
  81.  
  82.  
  83. int main()
  84. {
  85. String s1( "123" );
  86. String s2;
  87. String s3 = s1 + s2 + "789";
  88. String s4;
  89.  
  90. s2 = "456";
  91. s4 = s3 + "0";
  92.  
  93. cout << s1.buf << endl;
  94. cout << s2.buf << endl;
  95. cout << s3.buf << endl;
  96. cout << s4.buf << endl;
  97.  
  98. return 0;
  99. }
  100.  
Success #stdin #stdout 0s 3028KB
stdin
Standard input is empty
stdout
123
456
123789
1237890