#include<iostream>
#include<string.h>
using namespace std;
class String
{
public:
String(const char *str=nullptr)
{
data = new char[strlen(str) + 4];
data += 4;
Getcount(data) = 1;
strcpy_s(data,strlen(data), str);
}
String(const String& rh):data(rh.data)
{
++Getcount(data);
}
String& operator=( const String& rh)
{
if (this != &rh)
{
Release();
data = rh.data;
++Getcount(data);
}
return *this;
}
char& operator[](int index)
{
if (Getcount(data) > 1)
{
Release();
char* str = new char[strlen(data) + 5];
str += 4;
strcpy_s(str, strlen(str),data);
data = str;
Getcount(data) = 1;
}
return data[index];
}
~String()
{
Release();
}
private:
int& Getcount(char* str)
{
return*(int*)(data - 4);
}
void Release()
{
if (--Getcount(data) < 1)
{
delete[](data - 4);
data = NULL;
}
}
char* data;
};