> 1、引用计数作为独立的一块空间
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
#class String
{
public:
String(char* str="")
:_Refcount(new int(1))
{
_str = new char[strlen(str) + 1];
_str = str;
*(_Refcount) = 1;
}
String(String const& str)
:_str(NULL)
{
_str = str._str;
_Refcount=str._Refcount;
(*(_Refcount)) += 1;
}
int& GetRefcount()
{
if ((*_Refcount) == 0)
{
delete[] _str;
delete[] _Refcount;
_str = NULL;
}
return *(_Refcount);
}
String& operator=(String const&str)
{
if (_str != str._str)
{
if (--GetRefcount() == 0)
{
{
delete[] _str;
delete _Refcount;
}
_str = str._str;
_Refcount = str._Refcount;
GetRefcount()++;
}
}
}
~String()
{
if (GetRefcount() != 0)
{
GetRefcount()--;
}
}
char* GetStr()
{
return _str;
}
private:
char* _str;
int* _Refcount;
};
void FunTest()
{
String s1("hello world!");
String s2(s1);
cout << s1.GetStr() << endl;
cout << s2.GetStr() << endl;
}
int main()
{
FunTest();
system("pause");
return 0;
}
2、字符串开辟四个字节存储引用计数
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
class String
{
public:
String(char* str)
:_str(new char[strlen(str)+5])
{
(*((int*)_str)) = 1;
_str = _str + 4;
strcpy(_str, str);
}
String(String const &str)
:_str(NULL)
{
_str = str._str;
(*(((int*)_str) - 1))++;
}
String& operator=(String const&str)
{
if (_str != str._str)
{
if (--GetRefcount() == 0)
{
_str = str._str;
++GetRefcount();
}
_str = str._str;
(*(((int*)_str) - 1))++;
}
}
char* GetStr()
{
return _str;
}
int& GetRefcount()
{
if ((*(((int*)_str) - 1)) == 0)
{
delete[] (_str-4);
}
return (*(((int*)_str) - 1));
}
~String()
{
if (GetRefcount() != 0)
{
(*(((int*)_str) - 1))--;
}
}
private:
char* _str;
};
void FunTest()
{
String s1("hello world!");
String s2(s1);
cout << s1.GetStr() << endl;
cout << s2.GetStr() << endl;
}
int main()
{
FunTest();
system("pause");
return 0;
}