Copy-On-Write(方式一)

///////////////////////////////////////////////////
/////////////////String类之写时拷贝////////////////
///////////////////////////////////////////////////
#include<iostream>           //方式一
using namespace std;
class String
{
public:
String()                //创建一个空字符串
:_p(new char[1]), _count(new int(1))
{
*_p = '\0';
} 

String(const char* str)       //创建一个str的字符串
:_p(new char[strlen(str) + 1]), _count(new int(1))
{
strcpy_s(_p,strlen(str) + 1,str);
}

String(const String& str)      //利用引用计数来实现写时构造
:_p(str._p), _count( str._count )
{
++(*_count);
}

String& operator = (String str)     //重新改写空间的内容,需要写时拷贝
{
Copy_On_Write();
swap(_p, str._p);
swap(_count, str._count);
return *this;
}

~String()
{
if (--(*_count) == 0)
{
delete[] _p;
delete _count;
}
}
public:
String& Copy_On_Write()             //写时拷贝的核心
{
if (*_count > 1)
{
(*_count)--;
char *tmp = _p;
_p = new char[strlen(_p) + 1];
strcpy_s(_p, strlen(tmp) + 1, tmp);
_count = new int(1);
}
return *this;
}
public:
void Print()
{
cout << _p << endl;
printf("p 所指的的空间地址为:0x%x\n", _p);
cout << "引用计数为 : " << *_count << endl << endl;
}

char& operator[](int pos)
{
Copy_On_Write();
return _p[pos];
}
protected:
char *_p;
int* _count;      //引用计数
};

void Test()
{
String str_1("自信、勇敢、坚持 久违了,欢迎回来!!!");
String str_2(str_1);
String str_3("爱拼才会赢!");
String str_4(str_3);
str_4 = str_2;
str_1.Print();
str_2.Print();
str_3.Print();
str_4.Print();

str_4[0] = 'S';
str_4[1] = 'H';
str_4.Print();
}

void main()
{
Test();
}


本文出自 “10747227” 博客,转载请与作者联系!

你可能感兴趣的:(写实拷贝)