class String{
public:
String(const char* str = "")
{
if (NULL == str){
_str = new char[1 + 4];
_str += 4;
*_str = '\0';
}
else{
_str = new char[strlen(str) + 1 + 4];
_str += 4;
strcpy(_str, str);
}
GetRef() = 1;
}
String(const String& s)
: _str(s._str)
{
GetRef()++;
}
String& operator=(const String& s)
{
if (_str != s._str){
Release();
_str = s._str;
++GetRef();
}
return *this;
}
~String()
{
Release();
}
char& operator[](size_t index)
{
if (GetRef() > 1){
char* temp = new char[strlen(_str) + 1 + 4];
*(int*)temp = 1;
temp += 4;
strcpy(temp, _str);
--GetRef();
_str = temp;
}
return _str[index];
}
const char& operator[](size_t index)const
{
return _str[index];
}
void Release()
{
if (_str && 0 == --GetRef()){
_str -= 4;
delete[] _str;
_str = NULL;
}
}
int& GetRef(){
return *((int*)_str - 1);
}
private:
char* _str;
};
void FunTest(){
String s("abcd");
String a(s);
s[0] = 'q';
}
int main(){
FunTest();
return 0;
}