????8??????+=????????????????????
String& String::operator+=(const String &s)
{
_addAssignOpt(s._cstr?? s._length);
return *this;
}
String& String::operator+=(const char *cstr)
{
if(cstr != NULL)
_addAssignOpt(cstr?? strlen(cstr));
return *this;
}
void String::_addAssignOpt(const char *cstr?? size_t len)
{
if(*_used == 1)
_addString(cstr?? len);
else
{
_decUsed();
_cstr = _renewAndCat(cstr?? len);
_used = new size_t(1);
}
}
void String::_addString(const char *cstr?? size_t len)
{
//????????????????ü????1????????
if(*_used != 1)
return;
if(len + _length > _capacity)
{
char *ptr = _renewAndCat(cstr?? len);
delete[] _cstr;
_cstr = ptr;
}
else
{
strncat(_cstr?? cstr?? len);
_length += len;
}
}
char* String::_renewAndCat(const char *cstr?? size_t len)
{
size_t new_len = len + _length;
size_t capacity = new_len;
capacity += (capacity >> 1);
char *ptr = new char[capacity+1];
if(_cstr != NULL)
memcpy(ptr?? _cstr?? _length);
ptr[_length] = 0;
_length = new_len;
_capacity = capacity;
strncat(ptr?? cstr?? len);
return ptr;
}
????+=????????????????????????????t??????????????д???????????д???????????????????????????????????ü???????????????μ?????????????????????????????????????????????????????????и???????????????????????ü????1??????????????ü????????????????????????????????????????????????????????????????????????????????????????ü???????1??ò??ò????????
???????????ü????1????????????????????????и???????飬???????????κβ??????????????????????????????????????????????????????????棬???????????????????????????????????????У????????????????·?????????
?????????ü??????1??????????????_decUsed??????????????????????ü???????????_renewAndCat????????????μ???????飬???????_cstr???????new????μ????ü????????????1.
?????????????У?_renewAndCat???????????μ???????飬????????????????????μ?????????У??????μ?????????????????????????μ???????????????_addString????е????ü????1?????????????????????????????????????????????????????????????????_renewAndCat???·?????????????飬?????и?????????????????delete[]??????_cstr????_renewAndCat??????????????????????
??????????????????????????????????????+=???????????????????????Σ???????????????????????????????????η???????????????????????????1.5??????????????????+=????????????????????????????????????????????????????·???????????????????????????+=??????*_used????1?????′?????+=???????п?????????????????????
??????????????????Ч????????1.5???????????????????????????????????ó????????????????λ???????£?
????int capacity = len;
????capacity += (capacity >> 1)
????????????????????“x = capacity + capacity/2??capacity = x”????????????????????2??????????????1.5???????????
????9??????????
????void String::clear()
????{
????_decUsed();
????_cstr = NULL;
????_used = new size_t(1);
????_length = 0;
????_capacity = 0;
????}
?????ú?????????????????????????????????????????????????????_decUsed???????????????????????????????ü?????????????????????????????????ɡ?????????????????????????
??????????o???????String????????
????10??????+??????
????String operator +(const String &lhs?? const String &rhs)
????{
????String stemp(lhs);
????stemp += rhs;
????return stemp;
????}
?????ú??????????????????????+=????????????????????rhs?????????????????stemp?????????????????????????????stemp???????stemp?????????????+?????????????
????11???????????????
????ostream& operator << (ostream &os?? const String &s)
????{
????os<<s.cstr();
????return os;
????}
????12???????????????
????istream& operator >> (istream &in?? String &s)
????{
????const int BUFFER_SIZE = 256;
????char buffer[BUFFER_SIZE];
????char *end = buffer + BUFFER_SIZE -1;
????s.clear();
????do
????{
????//?????ж????????????????????????δ??????????????????buffer
????//??????????buffer???????????get???????'