class String {
public:
String(char* p){
assign(p, strlen(p));
}
String(const String& s){
assign(s.data, s.sz);
}
~String(){delete[] data;}
void make_cstring(char* p, int len) const
{
if(sz <= len)
strcpy(p, data);
else
throw("Not enough memory supplied");
}
String& operator=(const String& s){ //不能先删除数据然后调用assign,因为把一个String赋给它自身肯定会失败
if(this != &s){
delete[] data;
assign(s.data, s.sz);
}
return *this;
}
String& String::operator+=(const String& s)
{
char* odata = data;
assign(odata, sz+s.sz+1);
strcat(data, s.data);
delete [] odata;
return *this;
}
private:
int sz;
char* data;
void assign(const char* s, unsigned len)
{
int n =len +1;
data = (char*)malloc(n*sizeof(char));
if(data == 0)
throw std::bad_alloc();
sz = len;
strcpy(data, s);
}
};
String operator+(const String& op1, const String& op2)
{
String ret(op1);
ret += op2;
return ret;
}