String.h
#include "iostream" using namespace std; class String { public: String(const String& str); String(const char* c); ~String(); String operator+(const String& str) const; String& operator=(const String& str); String& operator+=(const String& str); bool operator==(const String& str) const; char operator[](int n) const; size_t size() const; char* c_str() const; friend ostream& operator<<(ostream&, const String& s); private: int len; char* data; };
String.cpp
#include "String.h" #include "string.h" size_t String::size() const { return len; } String::String(const String& str) { this->len = str.size(); this->data = new char[len + 1]; strcpy(data, str.c_str()); } String::String(const char* c) { if (!c) { len = 0; data = new char[1]; data[0] = '\0'; } else { len = strlen(c); data = new char[len + 1]; strcpy(data, c); } } String::~String() { delete []data; len = 0; } String String::operator+(const String& str) const { char* tmp = new char[len + str.size() + 1]; strcpy(tmp, this->c_str()); strcat(tmp, str.c_str()); return String(tmp); } String& String::operator=(const String& str) { this->len = str.size(); this->data = new char[len + 1]; strcpy(data, str.c_str()); return *this; } String& String::operator+=(const String& str) { len+=str.size(); strcat(data, str.c_str()); return *this; } bool String::operator==(const String& str) const { if (len != str.size()) return false; for (int i = 0; i < len; i++) { if (operator[](i) != str[i]) return false; } return true; } char String::operator[](int n) const { if (n < 0) n = n % len + len; if (n >= len) return '\0'; return *(data + n); } char* String::c_str() const { char* tmp = new char[len + 1]; strcpy(tmp, data); return tmp; } ostream& operator<<(ostream& out, const String& s) { out << s.data; return out; }
以上代码还有很多问题,详见:
其中赋值操作没有检查自赋值,改成:
String& String::operator=(const String& str) { if (this == &str) return *this; delete [] data; this->len = str.size(); this->data = new char[len + 1]; strcpy(data, str.c_str()); return *this; }其他+=也做类似修改即可