#include<iostream>
#pragma warning(disable:4996)
using namespace std;
//class String
//{
//public:
// String(char* str = " ")
// :_str(new char[strlen(str) + 1]) //多一个字节存‘\0’
// , _pRefcount(new int(1)) //开辟一个int空间初始化为1
// {
// strcpy(_str, str);
// }
//
// String(const String& s)
// :_str(s._str)
// , _pRefcount(s._pRefcount)
// {
// ++(*_pRefcount);
// }
// ~String()
// {
// _Release();
// }
//
// String& operator=(const String& s)
// {
// if (this != &s)
// {
// _Release();
// _str = s._str;
// _pRefcount = s._pRefcount;
// ++(*_pRefcount);
// }
// return *this;
// }
//
// char& operator[](size_t index)
// {
// if (*_pRefcount > 1)
// {
// --(*_pRefcount);
// // copy on write
// char* tmp = new char[strlen(_str) + 1];
// strcpy(tmp, _str);
// _str = tmp;
// _pRefcount = new int(1);
// }
// return _str[index];
// }
//
// friend ostream& operator<<(ostream& out, const String& s);
//
//private:
// void _Release()
// {
// if ((--(*_pRefcount) == 0) && _str)
// {
// delete[] _str;
// delete _pRefcount;
// }
// }
//
//private:
// char* _str;
// int* _pRefcount; //引用计数
//};
//
//ostream& operator<<(ostream& out, const String& s)
//{
// out << s._str << endl;
// return out;
//}
**//优化版**
class String
{
public:
String(char* str = " ")
:_str(new char[strlen(str) + 5])
{
_str += 4;
strcpy(_str, str);
_GetRefCount(_str) = 1;
}
String(const String& s)
:_str(s._str)
{
++_GetRefCount(_str);
}
~String()
{
_Release();
}
String& operator=(const String& s)
{
if (this != &s)
{
_Release();
_str = s._str;
++_GetRefCount(_str);
}
return *this;
}
char& operator[](size_t index)
{
if (_GetRefCount(_str) > 1)
{
--_GetRefCount(_str);
char* tmp = new char[strlen(_str) + 5];
tmp += 4;
strcpy(tmp, _str);
_str = tmp;
_GetRefCount(_str) = 1;
}
return _str[index];
}
private:
int& _GetRefCount(char* ptr)
{
return *(int*)(ptr - 4);
}
void _Release()
{
if (--_GetRefCount(_str) == 0)
{
delete[](_str - 4);
}
}
friend ostream& operator<<(ostream& out, const String& s);
private:
char* _str;
};
ostream& operator<<(ostream& out, const String& s)
{
out << s._str << endl;
return out;
}
void Test()
{
String s1("abcd");
//String s2(s1);
s1[0] = ‘f‘;
cout << s1;
//cout << s2;
}
void Test1()
{
String s1("abcd");
String s2;
cout << s2;
String s3(s2);
s2 = s1;// s2.operator=(&s2,s1)
cout << s2;
cout<<s3<<endl;
}
int main()
{
Test();
//Test1();
getchar();
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/yangrujing/article/details/48057501