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;
}
其他+=也做类似修改即可