如上个文章所事例,另外开辟一个指针的做法是不理想的。
用计数的方法平不是一定需要新的定义来实现。 我们在_pstr里面多开辟一块4个字节的空间就可以存储 一个int型的数。
代码实现如下。 在这里给出了和优化一的区别。
class String
{
public:
String(const char* pstr = "")
//:_pstr(new char[strlen(pstr)+4+1])
{
/*if(NULL == pstr)
{
_pstr = new char[5];
*_pstr = '\0';
}
else
{*/
_pstr = new char[strlen(pstr)+4+1];
*((int*)(_pstr)) = 1;
_pstr = _pstr + 4;
strcpy(_pstr,pstr); //切记指针的位置
//}
//*_pcount = 1;
}
String(const String& t)
:_pstr(t._pstr)
//,_pcount(t._pcount)
{
++(*((int*)(_pstr-4)));
//++(*_pcount);
}
String& operator=(const String& t)
{
if(this != &t)
{
if( 0 == --(*((int*)(_pstr-4))))
{
_pstr = _pstr - 4;
delete[] _pstr;
//delete _pcount;
}
_pstr = t._pstr;
//_pcount = t._pcount;
++(*((int*)(_pstr-4)));
}
return *this;
}
~String()
{
if(0 == --(*((int*)(_pstr-4))))
{
_pstr = _pstr -4;
delete[]_pstr;
//delete _pcount;
_pstr = NULL;
//_pcount = NULL;
}
}
private:
char* _pstr;
//int* _pcount;
};
void Funtest()
{
String s1("hello");
String s2(s1);
String s3;
s3 = s2;
}
int main ()
{
Funtest();
return 0;
}